将新字段添加到MongoDB中集合的object类型数组中

将新字段添加到MongoDB中集合的object类型数组中,mongodb,nosql,Mongodb,Nosql,请参见下面的示例(来自mongochef的json格式)。我需要为集合中的每个元素添加一个名为isReadOnly(bool)的新字段。我该怎么做?我可以很容易地将它添加到文档的根目录中,但要在每个数组元素中完成这项工作却很困难 { "_id" : "fda42f22-0fa4-4e4a-94bf-245b1124c8b9", "_t" : "FullConfiguration", "DeviceConfigName" : "Illinois", "Elements" : [ {

请参见下面的示例(来自mongochef的json格式)。我需要为集合中的每个元素添加一个名为isReadOnly(bool)的新字段。我该怎么做?我可以很容易地将它添加到文档的根目录中,但要在每个数组元素中完成这项工作却很困难

{ 
"_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)
    }, .....
您可以这样做(如果您的集合称为“coll”):

您可以这样做(如果您的集合称为“coll”):


@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 } }
    );    
}

@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 } }
    );    
}

@David我已经找到了MongoDB 3.6+的工作解决方案

db.collection.update({},
    { $set: { "Elements.$[].isReadOnly": false } }, { multi: true }
)
此命令将在文档的所有
元素
数组字段中添加
isReadOnly=false
字段

$position
修饰符指定数组中
$push
操作符插入元素的位置。如果不使用
$position
修饰符,则
$push
操作符会将元素插入数组的末尾。有关更多信息,请参见
$push
修改器


您可以在

@David上找到更多详细信息,我已经找到了MongoDB 3.6+的工作解决方案

db.collection.update({},
    { $set: { "Elements.$[].isReadOnly": false } }, { multi: true }
)
此命令将在文档的所有
元素
数组字段中添加
isReadOnly=false
字段

$position
修饰符指定数组中
$push
操作符插入元素的位置。如果不使用
$position
修饰符,则
$push
操作符会将元素插入数组的末尾。有关更多信息,请参见
$push
修改器


您可以在

上找到更多详细信息,这会将另一个
{isReadOnly:false}
文档推送到现有元素数组中,而不是推送到数组中的每个文档中。MongoDB JIRA上有一个公开的问题,我认为唯一的方法是在JavaScript内部使用Mongoose或其他MongoDB驱动程序。@dyouberg有更好的方法可以做到这一点,您可能不想像答案中所示那样迭代光标,因为存在竞争条件的可能性,记住Murphy定律这会推送一个
{isReadOnly:false}
到现有的元素数组,而不是数组中的每个文档。MongoDB JIRA对此存在一个公开问题,我认为唯一的方法是在JavaScript内部使用Mongoose或其他MongoDB驱动程序。@dyouberg有更好的方法来做到这一点,您可能不想像ans中所示那样迭代光标wer因为存在竞争条件的可能性,记住Murphy定律这也不好。这在MongoDB 2.4中事实上是正确的,即使这样,你也可以只迭代光标,而不是curor。最好的方法是使用它也不好。这在MongoDB 2.4中事实上是正确的,即使这样,你也可以迭代e光标,而不是curor。最好的方法是使用