#mongodb #optimization #duplicates #aggregate #grouping
#mongodb #оптимизация #дубликаты #агрегат #группировка
Вопрос:
Документы выглядят так.
{
"sId": "s1",
"language": "hindi",
"service": "editing",
"count": 5,
},
{
"sId": "s2",
"language": "hindi",
"service": "editing",
"count": 6,
},
{
"sId": "s2",
"language": "hindi",
"service": "reading",
"count": 6,
},
{
"sId": "s3",
"language": "english",
"service": "reading",
"count": 10,
}
Я хочу, чтобы результат был таким
{
"language":"hindi",
"count": 11
},
{
"language":"english",
"count": 10
}
Я попытался выполнить агрегированный запрос следующим образом
{
"$group": {
"_id": {
"lang": "$language",
"sId": "$sId"
},
"count": {"$sum": "$count"}
}
}
В sId: s2
нем следует игнорировать второй объект.
Может кто-нибудь, пожалуйста, дать мне подсказку, как я могу достичь вышеуказанного.
Ответ №1:
Вы можете использовать $first
для получения первого элемента каждой группы. Затем вы можете снова использовать $group
sum by language
.
{
"$group": {
"_id": {
"language": "$language",
"sId": "$sId"
},
"count": {
"$first": {
"$sum": "$count"
}
}
}
}
Комментарии:
1. Есть ли какой-либо способ, которого мы можем избежать
allowDiskUse: true
в этом варианте, поскольку в коллекции миллион документов.2. Вы можете попытаться улучшить запрос, используя
$sort and $group
или сопоставляя $ только для подмножества документов. Если это все еще слишком медленно, и вам нужно часто запускать запрос без кэширования, я бы посоветовал переработать эту часть вашего приложения, чтобы отслеживать эту информацию каким-либо другим способом.