MongoDB聚合框架: $project: use a value of a doc as the name of a key

标签 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 ,其关联的值(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/

相关文章:

mongodb - Grails GORM + Mongo,如何将自定义数据保存到ID?

node.js - 用 Mongoose 填充后如何聚合

mongodb - 在不使用展开的情况下匹配数组中的两个相等字段

mongodb - 如何在 MongoDB 聚合方法中连接整数数组?

javascript - 来自外国集合的项目特定字段 $lookup 结果

java - 带有 mongodb bson 库的 Mongodb 驱动程序在单独的项目中使用时会导致 completableFuture 挂起

mongodb - 在 Mongo 服务器端 javascript 中输出到控制台

javascript - MongoDB 无法将 $addToSet 应用于 Meteor JS 中的非数组

mongodb - mongo中将多个子文档合并成一个新文档

mongodb - 根据mongodb中的条件查询多个查找并将数据聚合到单个数组中