#mongodb
Вопрос:
Я пытаюсь обобщить результаты, но мне нужно включить только 1 результат за дату/день. Вот как выглядит мой запрос в настоящее время:
.aggregate([
{
$lookup: {
from: 'community_stats',
as: 'stats',
let: { id: '$_id' },
pipeline: [
{
$match: {
$expr: { $eq: ['$community', '$id'] },
},
},
{ $sort: { date: -1 } },
{ $limit: 5 },
],
},
},
])
Который возвращает массив, подобный этому:
stats: [
{
_id: new ObjectId("613d42f20e8023815b8f0ad3"),
community: new ObjectId("6138ef0a00895c22c6cd3b68"),
data: [Object],
date: 2021-09-11T23:59:46.998Z
},
{
_id: new ObjectId("613b784e564ee6ad3e2dbb14"),
community: new ObjectId("6138ef0a00895c22c6cd3b68"),
data: [Object],
date: 2021-09-10T15:22:54.764Z
},
{
_id: new ObjectId("6139f9487e4c964ef9dafd11"),
community: new ObjectId("6138ef0a00895c22c6cd3b68"),
data: [Object],
date: 2021-09-09T12:08:40.198Z
},
{
_id: new ObjectId("6139f6eac570e66aa60a8b5f"),
community: new ObjectId("6138ef0a00895c22c6cd3b68"),
data: [Object],
date: 2021-09-09T11:58:34.463Z
}
]
Кто-нибудь знает, как это можно сделать?
Комментарии:
1. Пожалуйста, предоставьте примерные данные
Ответ №1:
Вы просто хотите добавить групповой этап$, в котором вы группируете матчи по дате, вот так:
db.collection.aggregate([
{
$lookup: {
from: "community_stats",
as: "stats",
let: {
id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$community",
"$id"
]
}
}
},
{
$group: {
_id: {
year: {
"$year": "$date"
},
month: {
"$month": "$date"
},
day: {
"$dayOfMonth": "$date"
},
},
first: {
$first: "$ROOT"
}
}
},
{
"$replaceRoot": {
"newRoot": "$first"
}
},
{
$sort: {
date: -1
}
},
{
$limit: 5
}
]
}
}
])
В моем примере используется $first
для выбора первого документа из каждого дня, однако вы можете использовать разные операторы / логику, если ее необходимо изменить.