Метод заполнения мангуста не заполняет все поля после обновления документа

Я меняю порядок массива, а затем заполняю его, но это не работает. Он по-прежнему работает с документами, которые я не пытался обновить.

У меня есть секционная модель с прегунтами внутри.

СЕКЦИОННАЯ МОДЕЛЬ

const Schema = mongoose.Schema;

const seccionSchema = new Schema({
  titulo: { type: String },
  preguntas: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Pregunta',
    },
  ],
});

МОДЕЛЬ ПРЕГУНТА

const Schema = mongoose.Schema;

const preguntaSchema = new Schema({
  titulo: { type: String, required: true },
});

Документ раздела с 2 preguntas выглядит примерно так:

{
    "preguntas": [
        "5fb0a48ccb68c44c227a0432",
        "5fb0a48ccb68c44c227a0433"
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 3
}

Что я хочу сделать, так это изменить порядок в массиве preguntas, чтобы _ids в конечном итоге были [33, 32] вместо [32, 33] (последние две цифры _ids). Я могу обновить с помощью метода .save() или .findOneAndUpdate(). Вот код, использующий findOneAndUpdate:

router.put('/:id', async (req, res) => {
  const seccionId = req.params.id;
  try {
    const seccion = await Seccion.findOneAndUpdate(
      { _id: seccionId },
      { preguntas: ['5fb0a48ccb68c44c227a0433', '5fb0a48ccb68c44c227a0432'] },
      { new: true }
    );
    res.json(seccion);
  } catch (err) {
    res.json({ message: err });
  }
});

Результат работает (и порядок изменен в атласе mongo):

{
    "preguntas": [
        "5fb0a48ccb68c44c227a0433",
        "5fb0a48ccb68c44c227a0432"
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 4
}

Но когда я пытаюсь использовать метод populate() мангуста, заполняется только один из идентификаторов preguntas или не заполняется ни один (ниже заполняется только pregunta с идентификатором, заканчивающимся на 32 ):

{
    "preguntas": [
        {
            "_id": "5fb0a48ccb68c44c227a0432",
            "titulo": "Pregunta 3",
            "__v": 0
        }
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 4
}

Итак, я предполагаю, что метод заполнения работает неправильно, но он работает с другими документами раздела, где я не пытался изменить порядок прегунтов внутри массива. Вот код, использующий метод заполнения:

router.get('/:id', async (req, res) => {
  const seccionId = req.params.id;
  try {
    const seccion = await Seccion.findById(seccionId).populate('preguntas');
    res.json(seccion);
  } catch (err) {
    res.json({ message: err });
  }
});

Было очень трудно заставить работать заполнение, я очень ценю чью-либо помощь


person Diego H. O'Hagan    schedule 10.12.2020    source источник


Ответы (1)


Вы уверены, что pregunta с идентификатором 5fb0a48ccb68c44c227a0433 существует в коллекции preguntas?

Способ работы populate заключается в том, что он выполняет вторую операцию find над коллекцией preguntas с идентификаторами в массиве, если документ не найден, он будет исключен из массива.

Проблема, вероятно, в том, что тот, который заканчивается на 33, не существует в коллекции preguntas.

person Hafez    schedule 10.12.2020
comment
Идентификатор, оканчивающийся на 33, действительно существует (проверено дважды), я даже могу увидеть результат другого документа, который использует тот же идентификатор, но не заполняет его. Я также сделал обновление вручную непосредственно в атласе mongo, изменив порядок идентификаторов нового документа Seccion и заполнив его, также не работает при изменении идентификаторов вручную:/ - person Diego H. O'Hagan; 10.12.2020
comment
Я полагаю, что может случиться так, что каждый индекс в массиве идентификаторов имеет указатель или ссылку, и если вы измените идентификатор, он будет указывать на старый идентификатор. Потому что, когда я изменил порядок идентификаторов, он снова заработал - person Diego H. O'Hagan; 10.12.2020