3

如何获取仅包含特定键中唯一数据的条目数量(在集合中)?

例如:

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

具有唯一键“tag”的条目数量,并返回 3。

ps:如果可能的话,如何获取所有找到的键的唯一值列表:“tag”?

4

2 回答 2

2

要获取unique值列表,您需要DISTINCTGROUP 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 回答
2

您可以使用Map/Reduc对条目进行分组。

我创建了名为“内容”的内容,并在其中插入了 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 回答