20

我从 mongodb 开始,并且有一个包含如下文档的集合

{
    "type": 1,
    "tags": ["tag1", "tag2", "tag3"]
}
{
    "type": 2,
    "tags": ["tag2", "tag3"]
}
{
    "type": 3,
    "tags": ["tag1", "tag3"]
}
{
    "type": 1,
    "tags": ["tag1", "tag4"]
}

有了这个,我想要一特定类型的所有标签。例如,对于类型 1,我想要tag1, tag2, tag3, tag4(任意顺序)的集合。

我能想到的只是获取标签并将它们添加到setpython中,但我想知道是否有办法使用mongodb的mapreduce或其他方法来做到这一点。请指教。

4

2 回答 2

43

如果您只想要一个(不同的)标签列表,那么最好使用 distinct。Map/Reduce 会更慢,并且不能为 javascript 部分使用索引。

http://docs.mongodb.org/manual/reference/method/db.collection.distinct/

db.coll.distinct("tags", {type:1})将返回一组 type=1 的标签。

于 2011-02-12T08:05:15.197 回答
3

没错,Map/Reduce 可能适用于您想要完成的任务,但 Set 可能更快且代码更少。

> m =     function() {
...         for (var tag in this.tags) {
...             emit(this.tags[tag], 1);
...         }
...     }

> r =     function(key, values) {
...         return 1;
...     }

> db.tags.mapReduce(m, r).find()
{ "_id" : "tag1", "value" : 1 }
{ "_id" : "tag2", "value" : 1 }
{ "_id" : "tag3", "value" : 1 }
于 2011-02-12T06:20:29.013 回答