У меня есть коллекция Mongoose, я хочу обновить вложенный вложенный документ.
Базовая настройка:
- родительская запись (Карта)
- который содержит массив детей (Фазы)
- каждый ребенок состоит из одного или нескольких внуков (Шаги).
Я хочу найти внука и обновить его.Мой подход заключается в том, чтобы найти родителя (Map), который содержит внука, а затем обновить его.
Это мои упрощенные схемы:
const phaseSchema = new mongoose.Schema(
{
name: String,
color: String,
steps: [
new mongoose.Schema(
{
name: String,
body: String,
entry: {
type: mongoose.SchemaTypes.ObjectId,
ref: 'entry',
default: null
}
},
{ timestamps: false }
)
]
},
{ timestamps: false, _id: true }
)
const mapSchema = new mongoose.Schema(
{
name: String,
phases: [phaseSchema]
},
{ timestamps: false }
)
export const Map = mongoose.model('map', mapSchema)
Я пытаюсь использовать ArrayFiltersнайти и обновить поддокумент, но не повезло:
req.body = {
map_id: 'some_mongoose_id',
step_id: 'some_other_mongoose_id'
}
const newEntryId = 'a_new_mongoose_id'
// Find the parent (Map) and update it
const UpdatedMap = await Map.update(
{ _id: req.body.map_id },
{
$set: {
'phases.$[i].steps.$[j].entry': mongoose.Types.ObjectId(newEntryId)
}
},
{
arrayFilters: [
{
'i.steps._id': mongoose.Types.ObjectId(req.body.step_id)
},
{
'j._id:': mongoose.Types.ObjectId(req.body.step_id)
}
]
}
)
Это приводит к следующей ошибке:
Ошибка: фазы не найдены.0.steps.0._id: "в схеме
По совпадению, фаза и шаг, которые я пытаюсь обновить, имеют индекс 0.
Если япоменяйте местами arrayFilters и жестко закодируйте индексы, вот так $set: {'phases.0.steps.0.entry': mongoose.Types.ObjectId(newEntryId)'}
, все работает.
Что я делаю не так?