Node.js mongoose更新子文档';设置为$s的属性无效

Node.js mongoose更新子文档';设置为$s的属性无效,node.js,mongoose,Node.js,Mongoose,我想更新子文档的一些属性。 我的模型和更新功能如下所示: const ParentSchema = mongoose.Schema({ ... subs : [SubSchema], ... }) const SubSchema = mongoose.Schema({ ... name : String, price : Number, ... }) const Pare

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

    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();
    }
现在,当我试图更新特定子文档的某些属性时,mongoose会做两件奇怪的事情:

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

  • 我无法在第一次或第二次更新被覆盖的子文档,这些值不会更改

  • ubuntu:16.04,mongoose:5.1.3,nodejs:8.11.1

  • 'subs.$':updateObj罪魁祸首是这一行,有关详细信息,请参阅文档
  • 尝试使用以下查询更新:

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