2016-12-08 2 views
0

См. Пример ниже (формат json от mongochef). Мне нужно добавить новое поле для каждого элемента нашей коллекции, называемого 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

Вы можете сделать это следующим образом (если ваша коллекция называется «Coll»):

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: false}' к существующему массиву элементов, а не к каждому документу внутри массива. Об этом, по-моему, единственный способ сделать это - внутри JavaScript, используя Mongoose или другой драйвер MongoDB. – dyouberg

+0

Ты прав, мой плохой. Это делает трюк. – guymaor86

+0

@dyouberg есть лучший способ сделать это, и вы, вероятно, не хотите итерации курсора, как это показано в ответе, потому что есть возможность для состояния гонки и помнить закон Мерфи – styvane

0

@Styvane, это то, что я придумал, это все еще кажется немного Hacky.

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, и даже тогда вы можете просто перебрать курсор, но вместо этого [снимок] (https://docs.mongodb.com/manual/reference/method/cursor.snapshot/) куратора , Лучший способ сделать это - [объемная операция] (https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/) – styvane