jon*_*onn 0 hashmap mongodb aggregation-framework
我想在条件集合列表中获取多个字段.我尝试了一个聚合请求,但我有一个错误.
我的请求
db.people.aggregate({$match:{createdDate:{$exists:true},"ad":"noc2"}},{$group:{value2:$value2}});
我的Json:
db.test.findOne(); { "_id" : ObjectId("51e7dd16d2f8db27b56ea282"), "ad" : "noc2", "list" : { "p45" : { "id" : "p45", "date" : ISODate("2014-01-01T12:18:30.568Z"), "value3" : 21, "value1" : 100, "value2" : 489 }, "p6" : { "id" : "p6" "date" : ISODate("2013-07-18T12:18:30.568Z"), "value3" : 21, "value1" : 100, "value2" : 489 }, "p4578" : { "id" : "4578" "date" : ISODate("2013-07-18T12:18:30.568Z"), "value3" : 21, "value1" : 100, "value2" : 489 } } }
我希望得到这个json,例如,结果:
{id:p45,value:587},{id:p4578,value:47},{id:p6,value:2}
Run Code Online (Sandbox Code Playgroud)
您的示例文档和聚合有几个问题:
createdDate
现有字段$group()
运营商处理一个文档的水平和需求的_id
外地来组list
字段是嵌入式文档,而不是数组这是一个调整后的示例文档,其中list
包含数组以及每个项目的一些唯一值,这些值恰好与value
您提到的数字相加:
db.people.insert({
"ad" : "noc2",
"createdDate" : ISODate(),
"list" : [
{
"id" : "p45",
"date" : ISODate("2014-01-01T12:18:30.568Z"),
"value3" : 21,
"value1" : 77,
"value2" : 489
},
{
"id" : "p6",
"date" : ISODate("2013-07-18T12:18:30.568Z"),
"value3" : 20,
"value1" : 20,
"value2" : 7
},
{
"id" : "4578",
"date" : ISODate("2013-07-18T12:18:30.568Z"),
"value3" : 21,
"value1" : 300,
"value2" : -319
}
]
})
Run Code Online (Sandbox Code Playgroud)
您现在可以使用$unwind
运算符来提取匹配的子文档.
从目前的问题描述中不清楚$group
你想要实现什么操作以及你是否真的需要$group
.
以下是使用聚合框架$add
(总计)每个列表项的三个值的示例:
db.people.aggregate(
// Find relevant docs (can use index if available)
{ $match: {
createdDate: { $exists:true },
"ad":"noc2"
}},
// Convert list array to stream of documents
{ $unwind: "$list" },
// Add (value1, value2, value3) for each list item
{ $project: {
_id: "$list.id",
value: { $add: [ "$list.value1", "$list.value2", "$list.value3"] }
}}
);
Run Code Online (Sandbox Code Playgroud)
样本输出:
{
"result" : [
{
"_id" : "p45",
"value" : 587
},
{
"_id" : "p6",
"value" : 47
},
{
"_id" : "4578",
"value" : 2
}
],
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
请注意,我只为此示例使用单个文档进行聚合,输出将是list
数组中每个项目的一个结果文档.
在实际使用中,您可能希望$group
按文档_id
或其他一些条件添加其他聚合步骤,具体取决于您尝试实现的结果.