У меня есть конечная точка, которая выполняет такую операцию:
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.log
s) в других местах, где я читал свойства из документов. Как если бы я сделал:
const doc = await MyModel.findById('someId');
const name = doc.name;
res.status(200).json(doc);
Ответ содержит id
вместо _id
. Это похоже на то, как функция преобразования вызывается, когда я что-то делаю с документами, но если я передаю документы непосредственно по мере их поступления из базы данных, ни toJSON
, ни toObject
не вызываются.
Заранее спасибо за ваши идеи. :)