将新字段添加到类型对象的Array中,以添加到MongoDB中的集合

时间:2016-12-08 16:23:32

标签: mongodb nosql

参见下面的例子(来自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)
    }, .....

3 个答案:

答案 0 :(得分: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 } } );
})

答案 1 :(得分:0)

@Styvane,这就是我想出的,它看起来有点像hacky。

private void Busy()
{
    SetReceiveTimeout(TimeSpan.FromSeconds(1));

    Receive<PauseJob>(msg =>
    {
        // Do something
    });

    Receive<ReceiveTimeout>(timeout =>
    {
        // I won't run until 1 second after 
        // all messages are processed or stashed
    });

    ReceiveAny(msg =>
    {
        Stash.Stash();
    });
}

答案 2 :(得分:0)

@David我正在使用MongoDB 3.6+的解决方案。

db.collection.update({},
    { $set: { "Elements.$[].isReadOnly": false } }, { multi: true }
)

此命令将在文档的所有isReadOnly = false数组字段中添加Element字段。

$position修饰符指定数组$push插入元素的位置。如果没有$position修饰符,则$push运算符会将元素插入到数组的末尾。有关更多信息,请参见$push修饰符。

您可以在position operator docs上找到更多详细信息