如何迭代匹配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在将来更容易被引用。
答案 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
}