2011-02-12 96 views
18

所有独特的标签,我用的MongoDB开始的列表,并与文档的集合,看起来像下面获取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(任何顺序)。

我所能想到的就是获取标签并将它们添加到Python中的set,但我想知道是否有方法使用mongodb的mapreduce或其他方法。请指教。

回答

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

这样做后,我仍然必须使用`set`方法以我需要的方式获取标签列表,那么为什么要使用map-reduce步骤呢?为什么不只是做一个`.find({},{tags:1})`并对它们进行操作...... – 2011-02-12 06:26:07

+0

你如何回归标签?你没有在你的问题中指定。 – 2011-02-12 06:35:19