#node.js #mongodb #mongodb-query #mongoose-schema
#node.js #mongodb #mongodb-запрос #mongoose-schema
Вопрос:
Я хочу, чтобы последние журналы из userlogs
коллекции были основаны на userId
концепции с группой, например, если у меня есть 10 журналов, записанных с двумя разными пользователями, и я хочу получить сведения о журналах.
Мой код:
let options = [
{
"$sort": {
"updatedAt": -1
}
},
{
"$group": {
"_id": "$userId"
}
},
{
"$group": {
"_id": null,
"count": {
"$sum": 1
},
"results": {
"$push": "$ROOT"
}
}
},
{
"$project": {
"count": 1,
"results": {
"$slice": [
"$results",
0,
10
]
}
}
}
];
Note.aggregate(options).allowDiskUse(true).exec((err, result) => {
console.log(result)
});
Образцы документов в моей коллекции журналов:
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-04T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-03T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-02T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-01T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-03T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-02T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-01T11:31:39.694Z" }
Я ожидаю вывода, подобного приведенному ниже:
[
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" }
]
Заранее спасибо
Ответ №1:
$sort
updatedAt
в порядке убывания$group
поuserId
и создайте массив журналов$slice
чтобы получить последнюю первую запись
let options = [
{ $sort: { updatedAt: -1 } },
{
$group: {
_id: "$userId",
latest: { $push: "$ROOT" }
}
},
{ $project: { latest: { $slice: ["$latest", 1] } } }
];
Комментарии:
1. не могли бы вы, пожалуйста, помочь мне получить этот формат вывода, [ { «_id»: «543543534», «latest»: [ { «id»: «54543543534», «logs»: «образец журнала» } ] } }
2. Вы можете использовать $push вместо $first.
3. да, это работает, но мне нужна только одна запись в формате массива. $ push возвращает массив всех записей в формате идентификатора группы. Причина в том, что мне нужно предоставить два формата с концепцией флага, если последнее значение true означает, что оно вернет массив из одной записи, в противном случае он должен возвращать массив всех записей. Второй формат $ push работает нормально.