Один запрос MongoDB для агрегирования - PullRequest
0 голосов
/ 29 августа 2018

У меня есть коллекция peopleColl, содержащая записи с данными людей. Каждая запись уникально индексируется по id и имеет поле managers типа array.

Пример:

{
   id: 123,
   managers: [456, 789]
},
{
   id: 321,
   managers: [555, 789]
}

Я хочу написать один запрос, чтобы найти всех людей с одним и тем же менеджером по нескольким идентификаторам (менеджерам). Поэтому, учитывая [456, 555, 789], желаемый результат будет:

{
    456: 1,
    555: 1,
    789: 2
}

Я могу сделать это (медленно) в цикле for в Python следующим образом:

idToCount = {id: peopleColl.count({"managers": id}) for id in ids}

Редактировать: меня в первую очередь интересуют решения <= MongoDB 3.4 </p>

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете попробовать ниже конвейера.

db.collection.aggregate([
  { "$unwind": "$managers" },
  { "$group": { "_id": "$managers", "count": { "$sum": 1 }}}
])

Выход:

{'_id': 456, 'count': 1},
{'_id': 555, 'count': 1},
{'_id': 789, 'count': 2}

Таким образом, вы можете выполнить цикл и создать отображение Id-Count

result = db.collection.aggregate([
      { "$unwind": "$managers" },
      { "$group": { "_id": "$managers", "count": { "$sum": 1 }}}
    ])

iD_Count = {}
result.forEach(function(d, i) {
iD_Count[d._id] = d.count;
})

iD_Count:

{
    456: 1,
    555: 1,
    789: 2
}
0 голосов
/ 29 августа 2018

Вы можете попробовать агрегацию ниже 3,6.

db.colname.aggregate([
  {"$unwind":"$managers"},
  {"$group":{"_id":"$managers","count":{"$sum":1}}},
  {"$group":{
    "_id":null,
    "managerandcount":{"$mergeObjects":{"$arrayToObject":[[["$_id","$count"]]]}}
  }},
  {"$replaceRoot":{"newRoot":"$managerandcount"}}
])
0 голосов
/ 29 августа 2018

Вы можете попробовать ниже агрегации в mongodb 3.4.4 и выше

db.collection.aggregate([
  { "$unwind": "$managers" },
  { "$group": { "_id": "$managers", "count": { "$sum": 1 }}},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": { "$toLower": "$_id" },
        "v": "$count"
      }
    }
  }},
  { "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
])

выход

[
  {
    "456": 1,
    "555": 1,
    "789": 2
  }
]
...