4

次のような私のコマンド:

db.item.remove()    
db.item.update({_id:{$in:['A1','A2']}},{$inc:{count:1}},{multi: true, upsert: true})

私の望む結果は

db.item.find() -->
{_id: 'A1', count: 1}
{_id: 'A2', count: 1}

しかし、実際には次のとおりです。

{_id: ObjectId(xxx), count: 1}
{_id: ObjectId(xxx), count: 1}

Upsert はクエリ配列の val を新しいドキュメントの _id として自動的に使用できないようですが、目的を達成する方法はありますか?

4

2 に答える 2

2

update一度にアップサートできるドキュメントは 1 つだけなので、2 つの呼び出しに分割する必要があります。

db.item.update({_id: 'A1'},{$inc:{count:1}},{upsert: true})
db.item.update({_id: 'A2'},{$inc:{count:1}},{upsert: true})
于 2012-12-21T05:23:53.123 に答える
0

ドキュメントがすでに存在するかどうかによって異なります。そうでない場合BatchInsertは、最新の MongoDB で関数に委任されているものを常に使用できinsertます: http://docs.mongodb.org/manual/applications/create/#insert

ドキュメントの配列を insert() メソッドに渡すと、insert() はコレクションへの一括挿入を実行します。

これは 1 つの方法ですが、ドキュメントが非常に小さいため、これをすべて 1 つのコマンドで実行することで得られる唯一の利点は、往復が 1 回で済むことですが、すべてのデータを同時にネットワーク経由で送信する必要があることです。 .

また、シャーディング時にバッチ挿入が変更されることに注意する必要があります。おそらく考慮すべき特定の考慮事項があります一括挿入がシステムに及ぼすパフォーマンスへの影響のため、シャード クラスターを使用しないでください。

ただし、ドキュメントが既に存在する可能性がある場合、atm が @JohnnyHK のように手動でコマンドを実行することが唯一の実際の方法です。mongoimportMongoDB の他のツールもバッチ挿入を行うため、ここでは役に立たないと思います。

于 2012-12-21T08:13:36.107 に答える