преобразование схемы мангуста не вызывается, если документ возвращается непосредственно из запроса

У меня есть конечная точка, которая выполняет такую ​​​​операцию:

        const pipeline = [
          {
            $match: {
              $and: [
                {
                  $or: [...],
                },
              ],
            },
          },
          {
            $group: {
              _id : '$someProp',
              anotherProp: { $push: '$$ROOT' },
            },
          },
          { $sort: { date: -1 } },
          { $limit: 10 },
        ]
        const groupedDocs = await MyModel.aggregate(pipeline);

Идея здесь в том, что возвращаемые документы выглядят так:

[
  {
    _id: 'some value',
    anotherProp: [ /* ... array of documents where "someProp" === "some value" */ ],
  },
  {
    _id: 'another value',
    anotherProp: [ /* ... array of documents where "someProp" === "another value" */ ],
  },
  ...
]

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

const response = groupedDocs.reduce((docs, group) => docs.concat(group.anotherProp), []);
res.status(200).json(response);

Моя проблема в том, что окончательные документы в ответе содержат поле _id, но я хочу переименовать это поле в id. Этот вопрос касается этой проблемы и, в частности, этот ответ должен работать, но по какой-то причине функция преобразования не вызывается. Другими словами, я пытался сделать это:

schema.set('toJSON', {
    virtuals: true,
    transform: function (doc, ret) {
        console.log(`transforming toJSON for document ${doc._id}`);
        delete ret._id;
    },
});
schema.set('toObject', {
    virtuals: true,
    transform: function (doc, ret) {
        console.log(`transforming toObject for document ${doc._id}`);
        delete ret._id;
    },
});

Но операторы console.log не выполняются, а это означает, что функция преобразования не вызывается. Так что я все еще получаю _id в ответе вместо id.

Итак, мой вопрос: как я могу получить id вместо _id в этом сценарии?

Стоит отметить, что toJSON и toObject вызываются (показ console.logs) в других местах, где я читал свойства из документов. Как если бы я сделал:

const doc = await MyModel.findById('someId');
const name = doc.name;
res.status(200).json(doc);

Ответ содержит id вместо _id. Это похоже на то, как функция преобразования вызывается, когда я что-то делаю с документами, но если я передаю документы непосредственно по мере их поступления из базы данных, ни toJSON, ни toObject не вызываются.

Заранее спасибо за ваши идеи. :)


person Uche Ozoemena    schedule 17.03.2021    source источник