MongoDB聚合框架:$ project:使用doc的值作为键的名称

时间:2016-02-04 10:41:20

标签: mongodb mongodb-query aggregation-framework nosql

我有以下子文档

{
    "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,而是关联的count。这有可能实现吗?

我到目前为止已尝试aggregate管道的末尾添加一个$project文档,如下所示:

{
    "$project": {
        "_id": 0,
        "$_id": "$count"
    }
}

但似乎这不起作用。有没有办法实现我想要的查询结果或者我应该坚持到目前为止所做的事情而忘记它,因为它不可能实现?

1 个答案:

答案 0 :(得分:2)

汇总框架无法从输出名称。在我们的应用程序层中执行此操作的最佳位置。正如评论中所建议的那样,您可以使用map reduce框架或forEach来实现此目的,但是,它们的性能通常较差,特别是在分片环境中,请参阅documentation