2016-04-25 25 views
0

私は次のような構造を持っているとしましょう。2つのクエリを1つのクエリに結合する

{ 
    name: "", 
    surname: "", 
    id: 1, 
    children: [ 
     {id: 2, name: "", age: ""}, 
     {id: 3, name: "", age: ""} 
    ] 
} 

状況に応じて新しい子を追加したり、既存の子フィールドを更新したいと考えています。

新しい子をリストに追加するには、次のようなクエリを作成しました。

db.collection.update({id: 1}, { 
    $push: { 
     children: { 
      name: "alex", 
      age: 12, 
      id : shortid.generate()     
     } 
    } 
}, { 
    upsert:true 
},function(err, result) { 

} 

これは、挿入または更新のどちらであっても、ID 1でドキュメントを更新する必要があります。したがって、これらの2つの状況を1つのクエリに結合することを検討してください。

子供の配列に子を追加したいのであれば、$ pushを使うべきです。それ以外の場合は、子オブジェクトのフィールドを更新する必要があります。だから$ condを使って私はこのようなクエリを書いた。

db.collection.update({id: 1}, 
     { 
      $cond : { 
      if: {id: {$exists: 21}} , 
      then: { 
       $set: { 
       children: { name: "new name", age: "new age"} 
       } 
      }, 
      else: { 
      $push: { 
       children: { 
        name: "alex", 
        age: 12, 
        id : 21     
       } 
      } 
     } 
    }, { 
     upsert:true 
    },function(err, result){} 

このようなクエリを使用することはできませんが、私はエラーが表示されます。あまりにも非現実的でしたか?私はこの2つの状況を別々に取るべきですか? id:1で同じ文書を更新するので、それは良いアイデアだったと思います。それは、更新か挿入かです。唯一の変更は、フィールドを設定するか、作成してchildren配列にプッシュするかを決定することです。あなたはこの状況のた​​めに何を提案しますか?そして、はい、私は認めます、私はmongodbと$ condでいくつかの経験をしようとしています。

+0

upset:trueは同じことを意味します。ドキュメントが存在する場合はそれを更新し、そうでない場合は提供された値で新しいドキュメントを挿入します。他のすべてのプログラミング言語と同様に、定義されたルールがあります。特定のキーワードやステートメントの後に追加できるもの。 MongoDBでも同様です。 'cond'が' update'でサポートされているかどうか、ドキュメントをチェックしてください。 – Saleem

+0

@saleem Allright upsertも同じことをしています。しかし、私はちょうど$プッシュします。私は条件をチェックしません。それは更新かどうか、それはちょうど新しい値で子オブジェクトをプッシュします。私が間違っている?しかし、私がしたいのは、1つのクエリを編集したり、プッシュしたりすることです。 –

+0

$ pushは、存在するかどうかにかかわらず配列に項目をプッシュすると仮定します。重複した項目がプッシュされないようにするには、$ addToSetを参照してください。 – Saleem

答えて

0

最初の解決方法は正しいですし、何をしたいのですか? upsertオプションは、ドキュメントが存在するかどうかをチェックするようmongoに指示します。 Mongoはそこにドキュメントがない場合は挿入します。既存のドキュメントには、指定されたIDを持つドキュメントが存在する新しい値を更新します。あなたは何もする必要はありません。

関連する問題