Mongodb组通过选择不存在的列

时间:2013-09-30 15:28:38

标签: mongodb aggregation-framework

我是MongoDB新手。我试图从文档中分组数据,这是有效的。但我现在想要添加一个包含静态数据的列。

例如,我可以在SQL中编写类似的东西。

select e.dptId, count(e.empId), 'foo' as foo
from employee e
group by e.dptId, 'foo'

我试过了,

db.employee.aggregate(
    { $group: {
        _id: { dptId: '$dptId', foo: 'foo' }, 
        empCount: { $sum: 1 }
    }}
);

给了我“异常:字段路径引用必须以'$'为前缀。我不能用$作为前缀,因为这将是字段引用。

我也试过这个,

db.employee.aggregate(
    { $group: {
        _id: { dptId: '$dptId' }, 
        empCount: { $sum: 1 },
        foo: 'foo'
    }}
);

这给了我“异常:组聚合字段'temp'必须定义为对象内的表达式”。

我尝试过使用大括号,没有大括号(如图所示)等。仍然没有运气。在mongodb甚至可能。

1 个答案:

答案 0 :(得分:0)

一个技巧是使用$ifNull运算符有条件地分配值:

db.employee.aggregate(
    { $group: {
        _id: { dptId: '$dptId', 
               foo: { $ifNull: ['$foo', 'foo'] }
             }, 
        empCount: { $sum: 1 }
    }}
);

在上面,它只是查找名为foo的字段,如果它不存在,则将foo分组字段设置为foo的值。您也可以更改MongoDB检查的字段。

您也可以使用$concat来获得理想的结果:

db.employee.aggregate( 
{ $group : { 
    _id : { dptId: '$dptId', 
            foo: { $concat : [ "foo" ] }
          },
    empCount: { $sum: 1 }
}});