mongoDB - 如何更新/插入数组内对象的字段?

时间:2017-07-23 10:31:49

标签: arrays mongodb object meteor mongodb-query

我有一个方法可以将新文档插入集合“items”。

//Example data of variables
var home = "home1";
var itemId = "123";
var username = Meteor.user().username;

//Upsert command
items.upsert({
    '_id': home
}, {
    $push: {
        'createdItems': {itemId, username, home}

    }

});

这会创建一个这样的文档:

"_id" : "home1",
    "createdItems" : [ 
        {
            "itemId" : "123",
            "username" : "Jon Doe",
            "home" : "home1"
        }, 
        {
            "itemId" : "456",
            "username" : "Jon Doe2",
            "home" : "home1"
        }, 
        {
            "itemId" : "789",
            "username" : "Jon Doe3",
            "home" : "home1"
        }
    ]
}

现在我需要能够更新现有字段并稍后在这些对象中插入新字段。这些对象中的itemId是“引用”。所以我需要一个mongoDB函数,它通过使用“itemId”作为查询运算符来插入或更新字段。像这样:

//update a field

    items.upsert({
    'itemId': "123"
    }, {

        $set: {
    'createdItems': {username: "Clark Kent"}
                }

        });

//insert new field

    items.upsert({
    'itemId': "123"
    }, {

        $set: {
    'createdItems': {Value: 1000}
                }

        });

或者我必须使用$ push?这些命令无法提供我需要的结果。最后,文档应如下所示:

"_id" : "home1",
    "createdItems" : [ 
        {
            "itemId" : "123",
            "username" : "Clark Kent",
            "home" : "home1",
            "Value" : 1000
        }, 
        {
            "itemId" : "456",
            "username" : "Jon Doe2",
            "home" : "home1"
        }, 
        {
            "itemId" : "789",
            "username" : "Jon Doe3",
            "home" : "home1"
        }
    ]
}

或者我是否必须为集合使用其他数据模式?如果是的话,当我想要“itemId”时,我可以选择哪一个,用户名“和”home“仍然在一个数组中但是”打包在一起“?

非常感谢。

1 个答案:

答案 0 :(得分:1)

如果你想更新下面的数组查询中的对象将工作正常

items.update({ 
  'createdItems.itemId': '123' 
}, { 
  $set: { 
    'createdItems.$.username': 'Clark Kent' 
  }
})

您还可以使用相同的查询轻松地向对象添加新字段。

items.update({ 
  'createdItems.itemId': '123' 
}, { 
  $set: { 
    'createdItems.$.username': 'Clark Kent' 
    'createdItems.$.newField': 'newFieldValue' 
  }
})