2016-11-01 4 views
2

Mongoの 'order'フィールドをすべてのドキュメントに更新して、1..2..3..4 .... 34としたいと思います。mongodb forEachを使用してすべてのドキュメントのキーを更新します

これを実行すると、すべて「注文」:「34」となります。 私は何が間違っていますか?

var i = 1; 
db.images.find().forEach(function() { 
db.images.update(
     {}, 
     { "$set": {"order": NumberInt(i)} }, 
     { multi: true } 
    ); 
    i++; 
}) 
+0

「[フィールドをフィールド内の値で更新]」(http://stackoverflow.com/questions/2606657/update-field-with-another-fields-value-in-the-document) – styvane

答えて

2

multi : trueは、クエリに一致するすべてのドキュメントが更新されることを意味します。クエリは{}で、すべてのドキュメントに一致します。したがって、基本的には、すべての文書をすべての反復でorderに更新しています。

また、同じ文書が複数回返されないようにするには、カーソルでモードを有効にする必要があります(snapshot)。あなたはこの試みることができる

:パフォーマンスの観点から

var i = 1; 
db.images.find().snapshot().forEach(function(image) { 
    db.images.update(
     {"_id" : image._id}, 
     { "$set": {"order": NumberInt(i)} } 
    ); 
    i++; 
}) 

を、バルクのAPIを使用することをお勧めします。 bulkwrite

+1

ありがとう4J41、これは働いた。私は今まで、どのように{"_id":image._id}が手助けをするかについては、あまり確信していなかったと思います。乾杯。 –

+0

それは動作しますが、あなたがしたくないものです。 – styvane

+0

あなたは何を指しているのか説明していただけますか? –

関連する問題