2012-05-15 31 views
3

如何获得只包含特定密钥中唯一数据的条目数量(集合中)?MongoDB条目数量

例如:

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

金额具有独特的键“标签”的条目,并返回3.

PS:如果可能的话,怎么弄的关键都发现唯一值的列表:“标签”?

回答

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

+0

谢谢!我只有14分,但你的回答值得+1。 –

+0

仅供参考:此解决方案可以使用,但仅适用于版本2.2以上的版本。截至2012年5月15日,2.2尚未发布。为了在目前使用它,你必须获得2.1开发版本。 –

+0

@SeanReilly db.version()在我的本地实例上返回2.0.5,并在提交它之前检查了代码。有效。什么部分如果不应该工作? –

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 } 
+1

谢谢!我只有14分,但你的回答值得+1。 –