我有以下子文档:
{
"id":1,
"url":"mysite.com",
"views":
[
{"ip":"1.1.1.1","date":"01-01-2015"},
{"ip":"2.2.2.2","date":"01-01-2015"},
{"ip":"1.1.1.1","date":"01-01-2015"},
{"ip":"1.1.1.1","date":"01-01-2015"}
]
}
以及到目前为止的以下查询:
db.collection.aggregate([
{
"$unwind": "$views"
},
{
"$group": {
"_id": "$views.ip",
"count": {
"$sum": 1
}
}
}
])
返回以下结果:
[
{
"_id":"2.2.2.2",
"count":1
},
{
"_id":"1.1.1.1",
"count":3
}
]
我想实现以下输出结果,或非常相似:
[
{
"2.2.2.2": 1,
"1.1.1.1": 3
}
]
其中每个键将是每个 _id
,其关联的值(value) count
。这可以实现吗?
到目前为止我已尝试在 aggregate
的末尾添加管a $project
像这样的文档:
{
"$project": {
"_id": 0,
"$_id": "$count"
}
}
但这似乎不起作用。有没有办法实现我想要的查询结果,或者我应该坚持到目前为止所做的事情并忘记它,因为这是不可能实现的?
最佳答案
聚合框架无法从值输出键名称。在我们的应用程序层中执行此操作的最佳位置。正如评论中所建议的,您可以使用 MapReduce 框架或 forEach
来实现此目的,但是,它们的性能通常较差,特别是在分片环境中,请参阅 documentation .
关于MongoDB聚合框架: $project: use a value of a doc as the name of a key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198829/