我想更新子文档的某些属性。 我的模型和更新功能如下所示:
const ParentSchema = mongoose.Schema({
...
subs : [SubSchema],
...
})
const SubSchema = mongoose.Schema({
...
name : String,
price : Number,
...
})
const ParentModel = mongoose.model('Item', ItemSchema);
function updateSubDocument(parentId, subId, updateObj){
return ParentModel.update(
{'_id' : parentId, 'subs._id' : subId},
{
'$set' : {
'subs.$' : updateObj
}
},
{
new : false,
overwrite : true,
runValidators: true
}
).exec();
}
现在,当我尝试更新特定子文档的某些属性时,猫鼬会做2件奇怪的事情:
子文档的属性被updateObj覆盖,因此所有其他属性(不在updateObj中)都丢失了。
第一次后我无法更新覆盖的子文档,值没有改变
ubuntu:16.04,猫鼬:5.1.3,nodejs:8.11.1,
答案 0 :(得分:1)
https://docs.mongodb.com/manual/reference/operator/update/positional/
尝试使用以下查询进行更新:
function updateSubDocument(parentId, subId, updateObj){
return ParentModel.update(
{'_id' : parentId, 'subs' : {$elemMatch:{_id:subId}},
{
'$set' : {
'subs.$.name' : updateObj.name,
'subs.$.price' : updateObj.price,
......
}
},
{
new : false,
overwrite : true,
runValidators: true
}
).exec();
}