猫鼬用$ set更新子文档的属性不起作用

时间:2018-06-25 11:09:00

标签: node.js mongoose

我想更新子文档的某些属性。 我的模型和更新功能如下所示:

    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件奇怪的事情:

  1. 子文档的属性被updateObj覆盖,因此所有其他属性(不在updateObj中)都丢失了。

  2. 第一次后我无法更新覆盖的子文档,值没有改变

ubuntu:16.04,猫鼬:5.1.3,nodejs:8.11.1,

1 个答案:

答案 0 :(得分:1)

  1. 'subs。$':updateObj 罪魁祸首是此行,有关详细信息,请参考文档

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();
}
  1. 猫鼬将在您替换/添加数组中的新对象时添加新的_id。因此,请分别更新值以避免这种情况。