【问题标题】:Get a list of all unique tags in mongodb获取 mongodb 中所有唯一标签的列表
【发布时间】:2011-06-25 23:35:00
【问题描述】:

我从 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 或其他方法来做到这一点。请指教。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您是对的,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 }
      

      【讨论】:

      • 在这样做之后,我仍然必须使用set 方法以我需要的方式获取标签列表,那么为什么还要使用 map-reduce 步骤呢?为什么不只是做一个.find({}, {tags:1}) 并对它们进行操作......
      • 您如何需要返回的标签?您没有在问题中指定。
      • 哎呀,以为很清楚,猜不...我希望它们在标签的列表或集合(基本上是任何可迭代的)中,没有重复,即只有不同的值跨度>
      • 上面的代码会给你这个。你的 python 代码会返回一个字典数组,你可以通过 tags['_id'] 之类的东西来引用每个标签。
      • 这是一个计数,而不是给定类型的一组不同的标签。它做的工作比需要做的要多。此外,您应该使用查询来按类型限制值,这样您就不会映射所有值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多