2017-05-09 6 views
1

これ以外のところではヘルプが見つかりませんでした。MongoDBは少数のレコードしか更新せず、新しい属性を作成し、値を代入します

基本的には、指定された属性を持っていない少数のドキュメントだけを更新したいと思います。

更新の値は、すでにドキュメント上にあるフィールドから取得されます。

これは私が試みたものですが、「文書のフィールドから」部分が好きではありませんでした。ここでCn doesn't exist.

db.getCollection('test').update(
    // query 
    { "id2" : { $exists: false } }, 

    // update 
    { id2: Cn }, 

    // options 
    { 
     "multi" : true, // update all documents 
     "upsert" : false // don't insert new documents 
    } 
); 

は私のテストデータである

/* 1 */ 
{ 
    "_id" : ObjectId("5912132c4a58677726d37168"), 
    "Cn" : "CA", 
    "id2" : "CAAB", 
    "Prov" : "AB" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("591213404a58677726d37172"), 
    "Cn" : "CA", 
    "id2" : "CANZ", 
    "Prov" : "NZ" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("591213534a58677726d37180"), 
    "Cn" : "CA", 
    "id2" : "CAMB", 
    "Prov" : "MB" 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("591213674a58677726d3718c"), 
    "Cn" : "US" 
} 

/* 5 */ 
{ 
    "_id" : ObjectId("591213894a58677726d371a3"), 
    "Cn" : "MX" 
} 

言ってこのすべてがすべきは、米国& MXでid2を作成し、それらの新しいid2が対応する値「米国」&「MX」を属性与えるです。

これは大したことではありませんが、私は144ヶ国& 10,000以上の文書にid2を追加することができます。

答えて

0

あなたはこれを試すことができます。

db.your_collection.aggregate([ 
    { $match : { id2 : { $exists: false }}}, 
    { $addFields: { 
     id2 : "$Cn" 
     } 
    }, 
    { $out : "your_collection" } 
]); 

これはID2フィールドを持っているコレクション内のすべての文書を削除します。

あなたは長い方法で、マングースでこれを行うことができます:あなたが唯一の表現が含まれており、自己参照はどちらか動作しません演算子で複数の項目を更新することはできません

db.getCollection('test').find({ "id2" : { $exists: false } }, function(err, docs){ 
    if(err){ 
     //handle errror 
    } 
    else if(!docs){ 
     // no docs found 
    } 
    else{ 
     for(var i=0; i< docs.length; i++){ 
      db.getCollection('test') 
       .findByIdAndUpdate(
        docs[i]._id 
        , { $set : { id2 : docs[i].Cn}} 
        , { new : true} 
        , function(err, doc){ 
       if(err){ 
        //handle error 
       } 
       else{ 
        //doc was updated 
       } 
      }); 
     } 
    } 
}); 
+0

同じエラー。 "undefined" – user5903880

+0

私は自分の答えを更新しました。今確認できますか? –

+0

私はそれといくつかの修正をしても演奏しました。それが私に与えることができるのは「Featched 0 records(s)」です。そして、データの中でnothignが変更されました。しかし、それはエラーがなかった – user5903880

0

を私が押しMihir Bhendeせずにこれに得なかったでしょう。ありがとうございました。

var c = db.getCollection('test').find(
    { "id2" : { $exists: false }} 
); 
c.forEach(function(myDoc) { 
    print("doc", myDoc.Cn); 

    db.getCollection('test').update({_id: myDoc._id}, {$set: { "id2": myDoc.Cn }}, function (err) { 
     if (err) { print("err"); } 
    }); 
});