想要仅更新mongodb

时间:2018-02-08 06:51:56

标签: node.js mongodb mongoose

我有这样的数据集:

{
    "_id" : ObjectId("5a7bee68996b551034015a15"),
    "sequenceid" : 1,
    "fruit" : [ 
        {
            "name" : "@APPLE",
            "value" : 2
        }, 
        {
            "name" : "@BANANA",
            "value" : 1
        }, 
        {
            "name" : "@ORANGE",
            "value" : 5
        }
}

想要仅更新Apple值,即从2到25更新。预期结果将是:

{
    "_id" : ObjectId("5a7bee68996b551034015a15"),
    "sequenceid" : 1,
    "fruit" : [ 
        {
            "name" : "@APPLE",
            "value" : 25
        }, 
        {
            "name" : "@BANANA",
            "value" : 1
        }, 
        {
            "name" : "@ORANGE",
            "value" : 5
        }
}

我尝试了代码,但这将替换所有条目,只做一个条目。我的代码是

db.Collection.update({'sequenceid': 1}, {$set: {'fruit' : {'name': '@APPLE', 'value': parseFloat(25)}}}, function(error, result){
  if(error){
console.log('error');
} else {
 console.log('success');
}
});

它可以产生结果:

{
    "_id" : ObjectId("5a7bee68996b551034015a15"),
    "sequenceid" : 1,
    "fruit" : [ 
        {
            "name" : "@APPLE",
            "value" : 25
        }
}//Delete all my rest entry

我怎么做到这一点。我是MongoDB的新手

3 个答案:

答案 0 :(得分:1)

如果您正在编写JavaScript查询,那么您可以像这样更新

 db.collection.find({'sequenceid': 1}).forEach(function(x){
        x.fruit.forEach(function(y){
                if(y.name=="@APPLE")
                {
                    y.value = 25 
                }
            })
        db.collection.update({_id:x._id},x)
    })

答案 1 :(得分:1)

这将仅更新第一次出现的记录。参考MongoDB - Update objects in a document's array (nested updating)

x => x.Name.Equals("ProviderType") && !x.IsActive

答案 2 :(得分:0)

db.Collection.update({
            _id: ObjectId("5a7bee68996b551034015a15"),
            "fruit": {
                $elemMatch: {
                    "name": "@APPLE"
                }
            }
        }, {
            $set: {
                "fruit.$.value": 25

            }
        })

在上面的更新操作中, $ elemMatch 运算符用于搜索数组中的值,在 $ set 阶段使用位置运算符 $ 更新属于数组元素的特定键的值