Предположим, есть следующие две модели, и модель Родитель должен иметь возможность хранить несколько дочерних элементов в виде массива:
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 должны быть заменены, а не добавлены.
Я безуспешно следовал различным подходам и не уверен, что лучше всего решить, как лучшеэта проблема.Я ценю любую помощь.