Замена вложенного документа тем же _id во вложенном массиве - PullRequest
0 голосов
/ 15 апреля 2019

Предположим, есть следующие две модели, и модель Родитель должен иметь возможность хранить несколько дочерних элементов в виде массива:

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
    }
  ]
}

Вопрос

Как должен быть изменен код, чтобы результат всех операций в родительском коллекции былбыть следующим:

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

Дети с одинаковым _id должны быть заменены, а не добавлены.

Я безуспешно следовал различным подходам и не уверен, что лучше всего решить, как лучшеэта проблема.Я ценю любую помощь.

...