在mongodb中选择聚合查询中的不同列数

时间:2015-01-16 08:27:41

标签: mongodb mongodb-query aggregation-framework

=================编辑简单的问题陈述开始================ < / p>

db.t2.insert({_id:1,account:"abc",vendor:"amazon"});
db.t2.insert({_id:2,account:"abc",vendor:"overstock"});
db.t2.insert({_id:3,account:"abc",vendor:"overstock"});

现在您必须按帐户查找唯一供应商组的数量。 这里将显示答案是

{ "_id" : "abc", "number" : 2 }

可能的解决方案

db.t2.aggregate(
{ $group : { _id : { "z" : "$z", "v" : "$v" }} },
{ $group : { _id : "$_id.z", number : { $sum : 1 } } }
);

或者只是添加设置然后计算它但是假设你有数百万条记录,那么如何有效地像sql语句你可以实现相同的效果?

select count(distinct(vendor)) from t group by account

===================问题陈述结束====================== ==

所以我喜欢跟随......

db.t.insert({_id:1,v:"xyz",z:1});
db.t.insert({_id:3,v:"123",z:1});
db.t.insert({_id:5,v:"xyz",z:1});

现在我想执行以下查询

select count(distinct(v)) from t group by z;

因此预期的结果是z = 1,不同的值是xyz&amp; 123

{ "_id" : 1, "number" : 2 }

我可以执行以下操作并获得上述结果。

db.t.aggregate(
{ $group : { _id : { "z" : "$z", "v" : "$v" } } },
{ $group : { _id : "$_id.z", number : { $sum : 1 } } }
);

但我不想两次执行$ group。因为假设我有更大的集合,那么首先它将进行分组,并且无论中间结果将被存储在内存中,直到第二组应用。这正是我想要避免的。

1 个答案:

答案 0 :(得分:0)

您需要汇总如下:

    {li> Group z并使用$addToSet累积v的所有值 运营商,每组维护v的唯一列表。
  • Project number字段作为number数组的$size

代码:

db.collection.aggregate([
{$group:{"_id":"$z","number":{$addToSet:"$v"}}},
{$project:{"number":{$size:"$number"}}}
])

o / p:{ "_id" : 1, "number" : 2 }