2017-03-02 11 views
2

私はmongodbのフィールドの値が同じドキュメントを更新するにはどうすればよいですか?

{ "_id" : ObjectId("58b713280000000000000000"), "role" : "admin", "clientId" : ObjectId("598231980000000000000000")}, 
{ "_id" : ObjectId("58dff1a80000000000000000"), "role" : "user", "clientId" : ObjectId("598231980000000000000000")}, 
{ "_id" : ObjectId("59077ea80000000000000000"), "role" : "user", "clientId" : ObjectId("598231980000000000000000")}, 
{ "_id" : ObjectId("59305d280000000000000000"),"role" : "user", "clientId" : ObjectId("598231980000000000000000")}, 
{ "_id" : ObjectId("5957ea280000000000000000"),"role" : "user", "clientId" : ObjectId("598231980000000000000000")}, 
{ "_id" : ObjectId("59593ba80000000000000000"), "role" : "admin", "clientId" : ObjectId("598b6c180000000000000000")}, 
{ "_id" : ObjectId("59821a280000000000000000"),"role" : "user", "clientId" : ObjectId("598b6c180000000000000000")}, 
{ "_id" : ObjectId("598228380000000000000000"),"role" : "user", "clientId" : ObjectId("598b6c180000000000000000")}, 
{ "_id" : ObjectId("598227fc0000000000000000"),"role" : "user", "clientId" : ObjectId("598b6c1d0000000000000000")} 

は、私は同じClientID値を持つすべてのドキュメントを検索し、例えば、役割「管理者」

をしている文書の値of_idとのclientIdを更新する必要があります。

{ "_id" : ObjectId("59593ba80000000000000000"), "role" : "admin", "clientId" : ObjectId("598b6c180000000000000000")}, 
{ "_id" : ObjectId("59821a280000000000000000"),"role" : "user", "clientId" : ObjectId("598b6c180000000000000000")}, 
{ "_id" : ObjectId("598228380000000000000000"),"role" : "user", "clientId" : ObjectId("598b6c180000000000000000")} 

これらの3、同じClientIDを持つ、私はその役割これら3

0123の間で「管理者」である文書の_idとのclientIdを更新します

は、その後、更新した後、その結果は以下のようになります。

{ "_id" : ObjectId("59593ba80000000000000000"), "role" : "admin", "clientId" : ObjectId("59593ba80000000000000000")}, 
{ "_id" : ObjectId("59821a280000000000000000"),"role" : "user", "clientId" : ObjectId("59593ba80000000000000000")}, 
{ "_id" : ObjectId("598228380000000000000000"),"role" : "user", "clientId" : ObjectId("59593ba80000000000000000")} 
+1

moongoseを試してみてくださいhttp://mongoosejs.com/docs/guide.html –

+0

シェルでクエリを実行する必要があります – Sabreena

+0

MongoDBサーバーのバージョンは? – chridam

答えて

2

はルート文書の_idをIEと定数値。そうでない場合は0。

次のパイプラインは、前のパイプラインからドキュメントをフィルタリングし、上記のグループに対して複数のカウントを持つものを返します。

このパイプラインステップでは、この配列を平坦化してドキュメントの非正規化フィールドを返し、正規化されていないフィールドをフィルタリングして、ロール "admin" _idのドキュメントのみを保持します。このパイプラインを実行すると、カーソルを使用して結果を反復してコレクションを更新します。

次の例は、上記に示します。

非常に大規模なコレクションのために
var cursor = db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$clientId", 
      "docId": { 
       "$addToSet": { 
        "$cond": [ 
         { "$eq": ["$role", "admin"] }, 
         "$_id", 
         0 
        ] 
       } 
      }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$match": { "count": { "$gt": 1 } } }, 
    { "$unwind": "$docId" }, 
    { "$match": { "docId": { "$ne": 0 } } } 
]) 

cursor.forEach(function(doc){ 
    db.collection.update(
     { "clientId": doc._id }, 
     { "$set": { "clientId": doc.docId } } 
    );  
}) 

書き込みが全てです、これはパフォーマンスが大幅にスピードアップすることができますように、あなたは一括であなたのコレクションを更新するためのinitializeUnorderedBulkOp()を使用することができますラウンドトリップなしでサーバーで1回実行する

var bulk = db.collection.initializeUnorderedBulkOp(), 
    counter = 0; 

cursor.forEach(function(doc){ 
    bulk.find({ "clientId": doc._id }).update({ "$set": { "clientId": doc.docId } }); 

    counter++; // increment counter for batch limit 
    if (counter % 500 === 0) { 
     // execute the bulk update operation in batches of 500 
     bulk.execute(); 
     // Re-initialize the bulk update operations object 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}) 

// Clean up remaining operation in the queue 
if (counter % 500 !== 0) { bulk.execute(); } 
+1

でサンプルを更新してください。@chridam – Sabreena

+0

@Sabreenaありがとうございます。 – chridam

0

はここに行きます!これを試して!その役割は"admin"ある場合は、グループ内で最も2つの要素の配列を作成するには、最初のclientIdによってグループ文書を、パイプラインを持つ集約演算を実行する必要があります

db.dbName.find({clientId:"bbbbb", role:"admin"}).forEach(function(doc){ 
    doc.clientId = doc._id; 
    db.dbName.save(doc); 
}) 
0

これを試してみてください。

db.sameValue.find({"clientId":ObjectId( "598b6c180000000000000000")、 "role": "admin"})forEach(function(obj){obj.clientId = obj._id; db.sameValue .save(obj);});

関連する問題