3

特定のキーに一意のデータのみを保持する (コレクション内の) エントリの量を取得するにはどうすればよいですか?

例えば:

{
   "_id": ObjectId("4f9d996eba6a7aa62b0005ed"),
   "tag": "web" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0006ed"),
   "tag": "net" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0007ed"),
   "tag": "web" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0008ed"),
   "tag": "page" 
}

一意のキー「tag」を持つエントリの量、および 3 を返します。

ps: 可能であれば、見つかったすべてのキーの一意の値のリストを取得するにはどうすればよいですか: 「タグ」?

4

2 に答える 2

2

Map/Reductを使用してエントリをグループ化できます。

「content」という名前のコンテンツを作成し、その中に4つのデータ(上記にリストしたもの)を挿入します。次に、次のmap / reduceコードを使用して、タグでグループ化できます。最終的に、結果はコンテンツ名「result」に書き込まれます。

var map = function() {
    emit(this.tag, 1);
};

var reduce = function(key,values){
    var result = 0;
    for(v in values){
        result += values[v];
    }
    return result;
};

res = db.content.mapReduce(map,reduce,{out:"result"}});

結果は以下のようになります。

{ "_id" : "net", "value" : 1 }
{ "_id" : "page", "value" : 1 }
{ "_id" : "web", "value" : 2 }
于 2012-05-15T13:22:42.603 に答える
2

unique値のリストを取得するには、 または のいずれDISTINCTかが必要GROUP BYです。MongoDB は両方のパラダイムをサポートしています。

すべての個別の値のリストを取得するには、tag次を実行します。

db.mycollection.distinct('tag');

また

db.runCommand({ distinct: 'mycollection', key: 'tag' })

length結果を見るだけでカウントを取得できます。

db.mycollection.distinct('tag').length

distinctドキュメントのコマンドに関する注意:Note: the distinct command results are returned as a single BSON object. If the results could be large (> max document size – 4/16MB ), use map/reduce instead

于 2012-05-15T13:20:05.767 に答える