Найти отдельные значения группы по другому полю mongodb - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть коллекция с такими документами:

{
    "_id" : ObjectId("5c0685fd6afbd73b80f45338"),
    "page_id" : "1234",
    "category_list" : [  
        "football", 
        "sport"
    ],
    "time_broadcast" : "09:13"
}

{
    "_id" : ObjectId("5c0685fd6afbd7355f45338"),
    "page_id" : "1234",
    "category_list" : [ 
        "sport",
        "handball"
    ],
    "time_broadcast" : "09:13"
}

{
    "_id" : ObjectId("5c0694ec6afbd74af41ea4af"),
    "page_id" : "123456",
    "category_list" : [ 
        "news", 
        "updates"
     ],
     "time_broadcast" : "09:13"
}

....

now = datetime.datetime.now().time().strftime("%H:%M")

То, что я хочу: когда time_broadcast равен "now", яполучить список отдельных "category_list" для каждого "page_id".

Вот как должен выглядеть вывод:

{
   { 
     "page_id" : "1234",
     "category_list" : ["football", "sport", "handball"] 
   },

   { 
     "page_id" : "123456",
     "category_list" : ["news", "updates"] 
   }
}

Я пытался так:

category_list = db.users.find({'time_broadcast': now}).distinct("category_list")

но это дает мне в качестве выходного списка различные значения, но

всех "page_id":

 ["football", "sport", "handball","news", "updates"] 

не category_list by page_id.

Любая помощь, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 18 декабря 2018

вам нужно написать агрегированный конвейер

  • $match - отфильтровать документы по критериям
  • $group - сгруппировать документы по ключевому полю
  • $addToSet - объединить уникальные элементы
  • $project - проект в требуемом формате
  • $reduce - уменьшить массив массив до массива на $concatArrays

агрегированный запрос

db.tt.aggregate([
    {$match : {"time_broadcast" : "09:13"}}, 
    {$group : {"_id" : "$page_id", "category_list" : {$addToSet : "$category_list"}}}, 
    {$project : {"_id" : 0, "page_id" : "$_id", "category_list" : {$reduce : {input : "$category_list", initialValue : [], in: { $concatArrays : ["$$value", "$$this"] }}}}}
]).pretty()

результат

{ "page_id" : "123456", "category_list" : [ "news", "updates" ] }
{
        "page_id" : "1234",
        "category_list" : [
                "sport",
                "handball",
                "football",
                "sport"
        ]
}

Вы можете добавить $sort к page_id конвейеру, если требуется

...