我有大量的文档在蒙戈数据库的结构如下:复杂aggregate命令的MongoDB
{
"_id" : {
"birthDate" : "1978-08-09",
"name" : "Peter"
},
"value" : {
"types" : {
"euro" : 90,
"unknown" : 2,
"dollar" : 3
}
}
}
并非所有的文件包含所有类型(即:他们有的只有euro
或没有unknown
领域)。
我想统计每个type
对于具有集合框架的特定名称的出现次数。
我有这样的:
db.collection.aggregate({$match: {_id : {name:"John"}}}, {$group: {_id: '', euro: {$sum: '$value.types.euro'}, dollar: {$sum: '$value.types.dollar'}, unknown: {$sum: '$value.types.unknown'}}})
但它返回:
{ "result" : [ ], "ok" : 1 }
我的问题是:我怎么能指望每个coin
的type
特定name
与蒙戈的总框架?难道是还可以得到一个列表的形式每一个名字:
"result" : [
{
"name" : "Peter",
"dollar" : 1,
"euro" : 12,
"unknown" : 4
}
]
"result" : [
{
"name" : "John",
"dollar" : 4,
"euro" : 10,
"unknown" : 3
}
]
我使用的MongoDB的Java驱动程序,所以如果答案是在Java代码中这将是完美的。
这就是我一直在寻找的东西。 现在我想知道:是否有可能只采取出生日期在两个日期之间的结果?即与第一个请求完全相同的结果,但仅限于1980-07-05和1985-08-05 – user3083022
之间的那些结果,您可以将$ match查询更新为{$ match:{“_id.name”:“John” ,“_id.birthDate”:{$ gte:“1980-07-05”,$ lte:“1985-08-05”}}} –
不错,现在问题是日期实际上是这样存储的: ' ISODate( “1980-08-05T22:00:00Z”)'。这些$ gte似乎并没有真正的工作,我得到'{“result”'':'''''''''''''''''''''''当我更新$匹配时'{$ match'':''{“_id.name”'':''“John”,''“_id.birthDate”'':''{$ gte'':'''ISODate(“1980- 07-5“)',''$ lte'':'''ISODate(”1985-08-05“)'}}}' – user3083022