2

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

例如,对于包含以下内容的集合:

{ _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

4 回答 4

1

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

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

将计数keyA为 1 的所有键。

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

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

于 2012-09-21T19:18:33.850 回答
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")
于 2012-09-21T19:21:19.557 回答
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);
});
于 2012-09-21T19:47:22.687 回答
1

获取 keyA 唯一值的分组计数的更简单方法是使用MongoDB 2.2 中的新聚合框架:

例如:

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

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

{
    "result" : [
        {
            "_id" : 2,
            "count" : 2
        },
        {
            "_id" : 1,
            "count" : 1
        }
    ],
    "ok" : 1
}
于 2012-09-22T22:03:45.480 回答