我从mongodb开始,并拥有一个包含以下文档的集合
{
"type": 1,
"tags": ["tag1", "tag2", "tag3"]
}
{
"type": 2,
"tags": ["tag2", "tag3"]
}
{
"type": 3,
"tags": ["tag1", "tag3"]
}
{
"type": 1,
"tags": ["tag1", "tag4"]
}
有了这个,我想要一个特定类型的所有标签的 set 。例如,对于类型1,我想要tag1, tag2, tag3, tag4
(任何顺序)的集合。
我能想到的只是获取标签并将它们添加到python中的set
,但我想知道是否有办法用mongodb的mapreduce或其他方法来实现。请指教。
答案 0 :(得分:42)
如果你只想要一个(不同的)标签列表,那么使用distinct是最好的。 Map / Reduce会慢一些,不能使用javascript部分的索引。
http://docs.mongodb.org/manual/reference/method/db.collection.distinct/
db.coll.distinct("tags", {type:1})
将为type = 1返回一组标记。
答案 1 :(得分: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 }