簡體   English   中英

MongoDB:通過鍵迭代收集嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM