Ошибка при использовании Mongoose ArrayFilters для обновления вложенного вложенного документа - PullRequest
0 голосов
/ 14 мая 2019

У меня есть коллекция 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)'}, все работает.

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...