MongoDB:按键迭代收集?

时间:2012-09-21 18:57:33

标签: mongodb indexing key

如何迭代匹配MongoDB集合中指定键的每个值的所有文档?

E.g。对于包含以下内容的集合:

{ _id: ObjectId, keyA: 1 },
{ _id: ObjectId, keyA: 2 },
{ _id: ObjectId, keyA: 2 },

...索引为{ keyA: 1 },如何在keyA:1,然后keyA:2等所有文档上运行操作?

具体来说,我想为每个keyA值运行文档的count()。因此,对于此集合,相当于find({keyA:1}).count()find({keyA:2}).count()

更新:关键字是否被编入索引与迭代方式无关,因此编辑后的标题和说明将使Q / A在将来更容易被引用。

4 个答案:

答案 0 :(得分:1)

我不确定我是否会把你带到这里,但这就是你要找的东西:

db.mycollection.find({ keyA: 1 }).count()

keyA的所有密钥计为1。

如果没有回答这个问题,你认为你可以更具体一点吗?

您的意思是对keyA的所有唯一键值进行汇总吗?

答案 1 :(得分:1)

可以使用多个查询实现:

var i=0;
var f=[];
while(i!=db.col.count()){
  var k=db.col.findOne({keyA:{$not:{$in:f}}}).keyA;
  i+=db.col.find({keyA:k}).count();
  f.push(k);
}

此代码的含义是收集数组f中 col 集合的 KeyA 对象的唯一值,这将是操作的结果。不幸的是,暂时执行此操作应该阻止任何操作,这将改变 col 集合。

<强>更新

使用distinct

可以更轻松地完成所有操作
db.col.distinct("KeyA")

答案 2 :(得分:1)

感谢@Aleksey指导我db.collection.distinct

看起来就是这样:

db.ships.distinct("keyA").forEach(function(v){
    db.ships.find({keyA:v}).count();
});

当然,在循环中调用count()并没有太大作用;在我的情况下,我一直在寻找包含多个文档的键值,所以我这样做了:

db.ships.distinct("keyA").forEach(function(v){
    print(db.ships.find({keyA:v}).count() > 1);
});

答案 3 :(得分:1)

获取keyA的唯一值的分组计数的一种更简单的方法是在MongoDB 2.2中使用新的Aggregation Framework

例如:

db.coll.aggregate(
  { $group : {
     _id: "$keyA",
     count: { $sum : 1 }
  }}
)

...返回一个结果集,其中每个_id是keyA的唯一值,其中包含该值出现次数的计数:

{
    "result" : [
        {
            "_id" : 2,
            "count" : 2
        },
        {
            "_id" : 1,
            "count" : 1
        }
    ],
    "ok" : 1
}