我正在查询MongoDB
db.getCollection('user_actions').aggregate([
{$match: {
type: 'play_started',
entity_id: {$ne: null}
}},
{$group: {
_id: '$entity_id',
view_count: {$sum: 1}
}},
])
获取包含两个字段的文档列表:
如何获得包含两个项目的列表列表,例如
[[entity_id, view_count], [entity_id, view_count], ...]
答案 0 :(得分:2)
实际上有两种不同的方法,具体取决于您的MongoDB服务器版本。
最佳方法是使用方括号[]
在MongoDB 3.2中直接在$project
阶段创建新的数组字段。这会为每个组返回一个数组。下一阶段是另一个$group
阶段,您将文档分组并使用$push
累加器运算符返回二维数组。
db.getCollection('user_actions').aggregate([
{ "$match": {
"type": 'play_started',
"entity_id": { "$ne": null }
}},
{ "$group": {
"_id": "$entity_id",
"view_count": { "$sum": 1}
}},
{ "$project": {
"_id": 0,
"result": [ "$_id", "$view_count" ]
}},
{ "$group": {
"_id": null,
"result": { "$push": "$result" }
}}
])
从MongoDB 2.6和3.2之前,您需要一种不同的方法。要创建阵列,您需要使用$map
运算符。因为$map
"输入"字段必须解析为和数组,您需要使用$literal
运算符将文字数组值设置为input
。当然$cond
运算符返回" entity_id"或" view_count"相应于" boolean-expression"。
db.getCollection('user_actions').aggregate([
{ "$match": {
"type": 'play_started',
"entity_id": { "$ne": null }
}},
{ "$group": {
"_id": "$entity_id",
"view_count": { "$sum": 1}
}},
{ "$project": {
"_id": 0,
"result": {
"$map": {
"input": { "$literal": [ "A", "B"] },
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el", "A" ] },
"$_id",
"$view_count"
]
}
}
}
}},
{ "$group": {
"_id": null,
"result": { "$push": "$result" }
}}
])
值得注意的是,这也适用于MongoDB 2.4。如果您正在运行MongoDB 2.2,则可以使用未记录的$const
运算符来执行相同的操作。