我有这样的数据集:
{
"_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的新手
答案 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 阶段使用位置运算符 $ 更新属于数组元素的特定键的值