【问题标题】:MongoDB design - tagsMongoDB 设计 - 标签
【发布时间】:2011-08-29 19:18:00
【问题描述】:

我是 MongoDB 新手。我有一个关于 MongoDB 性能的设计问题。假设我有两个属性的电影类,名称和导演。我也想标记这个电影类。向此类添加新的字符串 [] 属性,还是创建一个新类 MovieTags 更好? 我知道我会经常查询这些标签,因为我会在 UI 上使用自动完成功能。对于这个自动完成功能,我只需要标签,而不需要 Movie 对象。 什么选择更好?添加字符串 [] 的属性或引用 MovieTags 的集合?考虑性能...当然在这两种情况下都会完成索引。

我应该使用 MapReduce 吗?如果我使用嵌入字符串 [] 对象,仅选择标签,用于自动完成功能?如何?

谢谢!

【问题讨论】:

标签: .net mongodb norm


【解决方案1】:

我可能会使用这样的架构,它将标签存储在字符串数组字段中:

db.movies.insert({
    name: "The Godfather",
    director: "Francis Ford Coppola",
    tags: [ "mafia", "wedding", "violence" ]
})

db.movies.insert({
    name: "Pulp Fiction",
    director: "Quentin Tarantino",
    tags: [ "briefcase", "violence", "gangster" ]
})

db.movies.insert({
    name: "Inception",
    director: "Christopher Nolan",
    tags: [ "dream", "thief", "subconscious" ]
})

对于这种类型的查询,您不需要 map-reduce。通过在电影文档中嵌入标签,您可以利用 MongoDB 的 multikey 功能,并使用单个 find() 查询查找具有给定标签的电影,如下所示:

db.movies.find( { tags: "dream" } )

就像你说的那样,为多键数组添加索引以提高查询性能也是值得的:

db.movies.ensureIndex( { tags: 1 } )

【讨论】:

  • 问题是你选择了孔电影对象,而我只需要自动完成的标签。你确定这样更快吗?
  • 这似乎并没有真正回答他的问题。您将如何获得在整个电影收藏中使用的不同标签列表?
  • 这将为您提供不同的标签列表:db.test.distinct('tags')
【解决方案2】:

您始终可以过滤作为查询结果的一部分返回的字段。

详细说明如何操作的文档的链接是http://docs.mongodb.org/manual/tutorial/query-documents/#Querying-FieldSelection

这将让您过滤掉电影对象中您不感兴趣的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 2013-10-21
    • 1970-01-01
    • 2012-10-30
    • 2012-05-12
    • 2011-10-24
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多