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

Jay*_*ruh 1 arrays object mongodb meteor mongodb-query

我有一种方法可以将新文档插入到集合“项目”中。

//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}

    }

});
Run Code Online (Sandbox Code Playgroud)

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

"_id" : "home1",
    "createdItems" : [ 
        {
            "itemId" : "123",
            "username" : "Jon Doe",
            "home" : "home1"
        }, 
        {
            "itemId" : "456",
            "username" : "Jon Doe2",
            "home" : "home1"
        }, 
        {
            "itemId" : "789",
            "username" : "Jon Doe3",
            "home" : "home1"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在我需要能够更新现有字段并稍后将新字段插入到这些对象中。这些对象中的 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}
                }

        });
Run Code Online (Sandbox Code Playgroud)

或者我必须使用 $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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢。

mpa*_*tny 7

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

items.update({ 
  'createdItems.itemId': '123' 
}, { 
  $set: { 
    'createdItems.$.username': 'Clark Kent' 
  }
})
Run Code Online (Sandbox Code Playgroud)

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

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