简单的计算属性的方法

时间:2014-11-30 21:07:54

标签: mongodb mongodb-query

我需要计算所有“真”的属性,但是使用标记和模型作为过滤器。

我有这样的文件:

{
  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?我只需要在数据库中返回一行,并使用此信息计算。

谢谢你

3 个答案:

答案 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

但是如果有任何方法然后返回对象而不是数组,那就更好了