Запрос агрегации Mongodb внутри массива с несколькими записями

У меня есть Mongo DB, который выглядит следующим образом:

имя коллекции: пользователи

{ username:'something'
 _id : ObjectId(someID1)
 acl : { users : [ObjectId(someID1),ObjectId(someID2),ObjectId(someID3)] , group : [grpID4,grpID5,grpID6] }
 .
 .
 .
}

Я хочу иметь агрегирующий запрос, который просматривает все документы для db.users.acl.users и находит количество каждого уникального идентификатора объекта.

Это похоже на добавление всех массивов users.acl.users, а затем возврат количества уникальных идентификаторов в словаре python

{
"result" : [
 {
 "_id" : ObjectId("someID1"),
 "count" : 20 

 },
 {
 "_id" : ObjectId("someID2"),
 "count" : 2
 },
 {
 "_id" : ObjectID("someID3")
 "count" : 1
 },

],
"ok" : 1
}

Я пробовал питоновский путь, который сначала добавлял все массивы, а затем находил счет, но я хочу сделать это больше по запросу, чем по сравнению с python. Я довольно не знаю, как запросить внутри такого массива.

любая идея, с чего начать?

1 ответ

Обычно, работая с массивами в MongoDB в структуре агрегации, вы хотите использовать оператор $unwind pipe для "де-нормализации" содержимого в виде отдельных документов. Это позволяет вам работать с ними на других этапах трубопровода:

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

Синтаксис Python, как правило, в основном идентичен синтаксису оболочки JavaScript, поэтому обычно должны применяться прямые примеры, такие как сопоставление от SQL к агрегированию.

licensed under cc by-sa 3.0 with attribution.