81

私は文書を持っています:

{ 'profile_set' :
  [
    { 'name' : 'nick', 'options' : 0 },
    { 'name' : 'joe',  'options' : 2 },
    { 'name' : 'burt', 'options' : 1 }
  ] 
}

profile_set名前がまだ存在しない場合は、新しいドキュメントをセットに追加したいと考えています (オプションに関係なく)。

したがって、この例で追加しようとすると:

{'name' : 'matt', 'options' : 0}

追加する必要がありますが、追加します

{'name' : 'nick', 'options' : 2}

が異なっnickていても、同じ名前のドキュメントが既に存在するため、何もしないでください。option

Mongoは要素全体と一致しているようで、最終的に同じかどうかを確認し、最終的には

profile_set containing [{'name' : 'nick', 'options' : 0}, {'name' : 'nick', 'options' : 2}]

これを行う方法はありますか、$addToSetそれとも別のコマンドをプッシュする必要がありますか?

4

2 に答える 2

106

が にすでに存在updateする場合、更新を防止するクエリ オブジェクトで を修飾できます。シェル内:nameprofile_set

db.coll.update(
    {_id: id, 'profile_set.name': {$ne: 'nick'}}, 
    {$push: {profile_set: {'name': 'nick', 'options': 2}}})

したがって、これは$push、一致する doc に対してのみ実行し、 where is要素_idがない場合にのみ実行されます。profile_setname'nick'

于 2013-01-25T18:40:24.287 に答える