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()
的示例模拟了与聚合的游标结果的交互。改变了我输入的方式,使它更明显\