2016-12-08 9 views
0

以下の例を参照してください(mongochefのjson形式)。 isReadOnly(bool)というコレクションの各要素に新しいフィールドを追加する必要があります。どうすればいい?私は簡単にドキュメントのルートに追加することができますが、各配列要素内でそれを行うために戦っています。MongoDBの型オブジェクトの配列に新しいフィールドを追加します。

{ 
"_id" : "fda42f22-0fa4-4e4a-94bf-245b1124c8b9", 
"_t" : "FullConfiguration", 
"DeviceConfigName" : "Illinois", 
"Elements" : [ 
    { 
     "_t" : "NumberConfigurationElement", 
     "AsciiConfigNumber" : NumberInt(10), 
     "DataType" : NumberInt(1), 
     "ByteOffset" : NumberInt(0), 
     "Name" : "alcohol_limit", 
     "Description" : "The alcohol limit of the device (ug/l)", 
     "AckResponse" : "HT-CONFG,010,00119", 
     "DevicePart" : NumberInt(1), 
     "Value" : NumberInt(119), 
     "DefaultValue" : NumberInt(119), 
     "Min" : NumberInt(50), 
     "Max" : NumberInt(500) 
    }, ..... 

答えて

2

(あなたのコレクションが「高専」と呼ばれている場合)あなたはこのようにそれを行うことができます。

db.coll.find().forEach(function(e) { 
    var t = e.Elements; 
    t.forEach(function(e) { 
     e.isReadOnly=false 
    }); 
    db.coll.update({ _id : e._id }, { $set: { Elements : t } }); 
}) 
+0

これは、追加の文書を押す '{IsReadOnlyの:偽}'既存の要素のアレイにはなく、アレイ内の各文書に。これについてMongoDB JIRAに未解決の問題があります。これを行う唯一の方法は、Mongooseまたは他のMongoDBドライバを使用するJavaScriptの中にあると思います。 – dyouberg

+0

あなたは正しく、私の悪いです。これはトリックです。 – guymaor86

+0

@dyoubergこれを行うにはより良い方法があります。競合状態の可能性があり、Murphyの法則を覚えているので、答えに示されているようにカーソルを反復したくないのはおそらくです。 – styvane

0

@Styvane、これはまだ少しハックようだ、私が思いついたものです。

var query = { 
    Elements: { 
     $elemMatch: { 
      _t: { $exists: true }, 
      isReadOnly: { $exists: false } 
     } 
    } 
}; 

while (db.collection.find(query).count() > 0) { 
    db.collection.update(
     query, 
     { $set: { "Elements.$.isReadOnly": true } } 
    );  
} 
+0

これも良くありません。これはMongoDB 2.4では事実上正しい*ですが、それでもカーソルを反復するだけでなく、curorの[スナップショット](https://docs.mongodb.com/manual/reference/method/cursor.snapshot/) 。これを行う最善の方法は[一括操作](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/)です。 – styvane

関連する問題