2

MongoDB コレクション内の指定されたキーの各値に一致するすべてのドキュメントを反復するにはどうすればよいですか?

たとえば、以下を含むコレクションの場合:

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

...インデックスが の場合、 、次になど{ keyA: 1 }のすべてのドキュメントに対して操作を実行するにはどうすればよいですか?keyA:1keyA:2

具体的には、値ごとにドキュメントの count() を実行したいと考えていkeyAます。したがって、このコレクションではfind({keyA:1}).count()find({keyA:2}).count()、 などに相当します。

UPDATE : キーがインデックス化されているかどうかは、それらがどのように繰り返されるかという点では無関係であるため、タイトルと説明を編集して、Q/A を後で参照しやすくしました。

4

4 に答える 4

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

私はあなたをここに連れてくるかどうか確信が持てませんが、これはあなたが探しているものですか:

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

すべてのキーを 1 としてカウントしますkeyA

それでも質問の答えにならない場合は、もう少し具体的にお答えいただけますか?

のすべての一意のキー値を集計するつもりkeyAですか?

于 2012-09-21T19:18:33.850 に答える
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
}
于 2012-09-22T22:03:45.480 に答える
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 に答える