2016-08-05 24 views
3

MongoDBの一括操作を使用して文書を挿入しています。MongoDB bulk operator、挿入されていない場合は挿入

私がしたいのは、ドキュメントが見つからない場合にのみ挿入することです。見つかった場合(アップアップ)は更新したくありません。

どのようにすればいいですか?

ただし、この場合であっても:

var obj = { 
item: 'test' 
} 

bulk.find({ item: {$ne : obj.item}}).upsert().updateOne(obj); 
bulk.execute(); 

これが見つからない場合は実際には何も挿入していないようです。

EDIT:

私はもう少し明確にするために、これを更新したかったです。

バルクAPIを使用して実行しようとしている操作は2つあります.1つは更新し、もう1つは挿入する操作です。

文書では、次のようになります。

{ 
    item: 'test', 
    categories: [{ 
    name: 'one', 
    attr: 'two' 
    }] 
} 

私が何をしたいのですがどのような項目の値が見つからない場合は、OBJを挿入しています。しかし、見つかった場合、categories.nameが見つからない場合、$pushカテゴリオブジェクトはcategories配列になります。ドキュメントが見つかってカテゴリが存在する場合は、何もしないでください。

答えて

0

あなたはこれを行うことができます:official docから

db.collection.update(query, update, {upsert: true}) 

例:あなたがしたいと思う何

db.people.update(
    { name: "Andy" }, 
    { 
     name: "Andy", 
     rating: 1, 
     score: 1 
    }, 
    { upsert: true } 
) 
6

を同じ更新操作を維持するが、クエリを変更することです。 documentationから:一致する文書がBulk.find()条件のために存在しない場合はtrueに設定UPSERTオプションを使用すると

Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>);

、その後、更新または交換作業が行い、インサート。一致する文書が存在する場合、更新または置換操作は指定された更新または置換を実行します。一致する文書が存在しない場合は、上記で

var obj = { item: 'test' }; 

bulk.find(obj).upsert().updateOne({ $setOnInsert: obj }); 
bulk.execute(); 

、更新操作など何もないんん$setOnInsertと、その後の更新:条件を満たした文書を探すために

変更クエリ挿入につながり、照会に一致する文書が見つかりました。

+0

お返事ありがとうございます。もう少し明確にするために質問を更新しました。私はあなたが言っていることをしようとしましたが、私はそこに正確にはいません。本当に助けに感謝します。 – dzm

+0

なぜ地球上に '.upsert()'があるのですか?時には、開発者がどのようにして常識を無視することができたのだろうか。直感的には、.updateOne({$ setOnInsert:obj}、{upsert:true}) 'ではないでしょうか?開発者の人生を恐ろしいものにするために、常に1つの逸脱していることを除いて、すべてが並んでいます。 – Rexford

関連する問題