MongoDB игнорирует дубликаты документов, используя уникальный ключ в aggregate

#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"
      }
    }
  }
}
  

https://mongoplayground.net/p/3_RjSt1wtRS

Комментарии:

1. Есть ли какой-либо способ, которого мы можем избежать allowDiskUse: true в этом варианте, поскольку в коллекции миллион документов.

2. Вы можете попытаться улучшить запрос, используя $sort and $group или сопоставляя $ только для подмножества документов. Если это все еще слишком медленно, и вам нужно часто запускать запрос без кэширования, я бы посоветовал переработать эту часть вашего приложения, чтобы отслеживать эту информацию каким-либо другим способом.