我在Mongo数据库中有大量具有以下结构的文档:
{
"_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 }
我的问题是:如何使用Mongo的聚合框架计算特定name
的每个coin
的type
?是否也可以获取表单中每个名称的列表:
"result" : [
{
"name" : "Peter",
"dollar" : 1,
"euro" : 12,
"unknown" : 4
}
]
"result" : [
{
"name" : "John",
"dollar" : 4,
"euro" : 10,
"unknown" : 3
}
]
我正在使用带有Java驱动程序的MongoDB,所以如果答案是Java代码,那就完美了。
您可以使用
以下查询按名称分组并计算硬币:
db.collection.aggregate(
{$group : {_id : "$_id.name",
dollar : {$sum : "$value.types.dollar"},
euro : {$sum : "$value.types.euro"},
unknown : {$sum : "$value.types.unknown"}}}
)
此外,如果您想查找特定人的硬币数量,您可以使用以下查询:
db.collection.aggregate(
{$match : {"_id.name" : "John"}},
{$group : {_id : "$_id.name",
dollar : {$sum : "$value.types.dollar"},
euro : {$sum : "$value.types.euro"},
unknown : {$sum : "$value.types.unknown"}}}
)
要计算特定name
的每个coin
的type
,您可以这样做:
db.collection.aggregate([
{
$match: {'_id.name' : "John"}
},
{
$project: {
_id: 1,
euro: {$cond: [ { $eq: [ '$value.types.euro', undefined ]} , 0, 1 ]},
dollar: {$cond: [ { $eq: [ '$value.types.dollar', undefined ]} , 0, 1 ]},
unknown: {$cond: [ { $eq: [ '$value.types.unknown', undefined ]}, 0, 1 ]}
}
},
{
$group: {_id: "$_id.name", euro: {$sum: '$euro'}, dollar: {$sum: '$dollar'}, unknown: {$sum: '$unknown'}}
}
])