[英]MongoDB: Iterate over collection by key?
如何遍歷與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更易於引用。
我不確定我能不能帶您到這里,但這就是您要尋找的東西:
db.mycollection.find({ keyA: 1 }).count()
將計算keyA
為1的所有密鑰。
如果那不能回答問題,您認為您可以更具體一點嗎?
您是要對keyA
所有唯一鍵值進行匯總嗎?
它可以通過多個查詢來實現:
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")
感謝@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);
});
一種獲取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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.