查找按另一个字段分组的不同值 mongodb
Find distinct values group by another field mongodb
我 collection 有这样的文件 :
{
"_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" 时,我得到每个 "page_id".
的不同 "category_list" 的列表
输出应该是这样的:
{
{
"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 来自 page_id .
有什么帮助吗?
谢谢
你需要编写聚合管道
$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"
]
}
如果需要,您可以通过 page_id
管道添加 $sort
我 collection 有这样的文件 :
{
"_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" 时,我得到每个 "page_id".
的不同 "category_list" 的列表输出应该是这样的:
{
{
"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 来自 page_id .
有什么帮助吗?
谢谢
你需要编写聚合管道
$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"
]
}
如果需要,您可以通过 page_id
管道添加 $sort