Javascript 将对象数组投影到键值

Javascript 将对象数组投影到键值,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,聚合后我得到这个结果 { "_id" : { "date" : ISODate("2017-08-30T00:00:00.000Z") }, "aggr" : [ { "gender" : "unknown", "count" : 365 }, { "gender" : "male", "count" : 2

聚合后我得到这个结果

{
    "_id" : {
        "date" : ISODate("2017-08-30T00:00:00.000Z")
    },
    "aggr" : [ 
        {
            "gender" : "unknown",
            "count" : 365
        }, 
        {
            "gender" : "male",
            "count" : 2
        }
    ]
}
是否可以将其转换为以下格式

{
    "date" : ISODate("2017-08-30T00:00:00.000Z"),
    "unknown" : 365,
    "male" : 2
}
尝试使用
$unwind
$project
,但无法将数组对象转换为键、值对

是,使用和将现有数组转换为它接受的格式:

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$concatArrays": [
          [{ "k": "date", "v": "$_id.date" }],  
          { "$map": {
            "input": "$aggr",
            "in": { "k": "$$this.gender", "v": "$$this.count" }
          }}
        ]
      }
    }    
  }}
])
当然,如果这实际上只是在现有聚合的“尾部”,并且您至少没有引入运算符的MongoDB 3.4.4,那么您可以简单地在客户端代码中重塑结果:

db.collection.aggregate([
  // existing pipeline
]).map(d => 
  Object.assign(
    { date: d._id.date },
    d.aggr.reduce((acc,curr) =>
      Object.assign(acc,{ [curr.gender]: curr.count }),{}
    )
  )
)

@史蒂夫:答案就是这么说的,它还说明了在管道的末尾,在较低版本中应该做什么。在任何较低版本中,您不能直接从聚合管道中将值用作键名。我不会将聚合结果写入任何集合,因此在3.4.4之前,是否不可能在聚合本身中执行此操作?@Steve我可以用多少种不同的方式说不?在这一点上我已经非常清楚了。这就是为什么会有一个新的接线员。如果有其他东西是可能的,那么它就不会被引入。同样,如果是“结果”,则只需在客户端代码中进行修改,就像正在演示的一样。@Steve实际上,您似乎很困惑。最后带有
.map()
的示例模拟了与聚合的游标结果的交互。改变了我输入的方式,使它更明显\