在嵌套数组中用相同的_id替换子文档

时间:2019-04-15 10:27:40

标签: mongodb mongoose mongoose-populate

假设有以下两个模型,并且模型Parent应该能够将多个子对象存储为一个数组:

const schemaChild = new Schema({
    _id: { type: Number, unique: true },
    name: { type: String }
});
mongoose.model('Child', schemaChild);

const schemaParent = new Schema({
    _id: { type: Number, unique: true }
    children: [{ 
        _id: { type: Number, unique: true },
        child { type: Number, ref: 'Child' }
    }]
});
mongoose.model('Parent', schemaParent);

数据通过以下方式添加:

const cb = (err) => { if(err) next(err); };

const _childA = await Child.findByIdAndUpdate(1, { _id: 1, name: 'Child A' }, { new: true, upsert: true }, cb);
const _childB = await Child.findByIdAndUpdate(2, { _id: 2, name: 'Child B' }, { new: true, upsert: true }, cb);

await Parent.findByOneAndUpdate(1, { $addToSet: { children: { _id: 1, child: _childA._id } } }, { upsert:true }, cb);
await Parent.findByOneAndUpdate(1, { $addToSet: { children: { _id: 1, child: _childB._id } } }, { upsert:true }, cb);

以下内容将存储在父集合中:

{
  "_id": 1,
  "__v": 0,
  "children": [
    {
      "_id": 1,
      "child": 1
    },
    {
      "_id": 1,        // $addToSet adds another child with the same _id, instead of replacing a child with the same _id
      "child": 2
    }
  ]
}

问题

如何修改代码,以便集合Parent中所有操作的结果如下:

{
  "_id": 1,
  "__v": 0,
  "children": [
    {
      "_id": 1,
      "child": 2
    }
  ]
}

具有相同_id的孩子应该被替换而不是被添加。

我采用了不同的方法,但没有成功,并且不确定要解决该问题的最佳实践。感谢您的帮助。

0 个答案:

没有答案