我需要计算所有“真”的属性,但是使用标记和模型作为过滤器。
我有这样的文件:
{
mark: "bmw",
model: "compact"
attr1: true,
attr2: false,
attr3: true
}
如果我使用的是mysql,我会做类似的事情:
SELECT count(attr1=true), count(attr2=true), count(attr3=true) FROM table WHERE mark = 1 AND model = 2
结果将是这样的:
{
attr1: 5,
attr2: 18,
attr3: 50
}
我怎样才能使用mongodb?我只需要在数据库中返回一行,并使用此信息计算。
谢谢你
答案 0 :(得分:1)
一种解决方案可能是
db.coll.aggregate([
{
$match:{"mark":"bmw","model":"compact"}
},{
$group:{
_id:null,
attr1: {
$sum: {
$cond: { if: { $eq: ["$attr1",true] },then: 1,else: 0 }
}
},
attr2: {
$sum: {
$cond: { if: { $eq: ["$attr2",true] },then: 1,else: 0 }
}
},
attr3: {
$sum: {
$cond: { if: { $eq: ["$attr3",true] },then: 1,else: 0 }
}
}
}
},{
$project:{
_id:0,
attr1:1,
attr2:1,
attr3:1,
}
}
])
结果是这样的
{
"result" : [
{
"attr1" : 2,
"attr2" : 1,
"attr3" : 3
}
],
"ok" : 1
}
你可以找到信息 http://docs.mongodb.org/manual/reference/operator/aggregation/cond/ 和 http://docs.mongodb.org/manual/aggregation/
答案 1 :(得分:1)
您也可以将项目和总和作为单独的操作进行,我认为这更容易理解:
db.cars.aggregate( [
{ $match:{model:'compact' } },
{ $project: { attr1:{ $cond: ['$attr1',1,0] }, attr2:{ $cond: ['$attr2',1,0] }, attr3 : { $cond: ['$attr3',1,0] } } },
{ $group: { _id:0, attr1:{$sum:'$attr1'}, attr2:{$sum:'$attr2'}, attr3:{$sum:'$attr3'} } }
] );
答案 2 :(得分:0)
@bamo 嗯,它的工作原理。谢谢你。
您可以将结果转换为对象而不是数组吗?
像这样:
{
"attr1" : 2,
"attr2" : 1,
"attr3" : 3
}
只有那个。
我正在使用nodejs,我可以这样做:
var objectInfo = response.result[0]; // first index
但是如果有任何方法然后返回对象而不是数组,那就更好了