我是 MongoDB 新手。我有一个关于 MongoDB 性能的设计问题。假设我有两个属性的电影类,名称和导演。我也想标记这个电影类。向此类添加一个新的字符串[] 属性,还是创建一个新类 MovieTags 更好? 我知道我会经常查询这些标签,因为我会在 UI 上使用自动完成功能。对于这个自动完成功能,我只需要标签,而不需要 Movie 对象。 什么选择更好?添加字符串 [] 的属性或引用 MovieTag 的集合?考虑性能...当然在这两种情况下都会完成索引。
我应该使用 MapReduce 吗?如果我使用嵌入字符串 [] 对象,仅选择标签,用于自动完成功能?如何?
谢谢!
最佳答案
我可能会使用这样的架构,它将标签存储在字符串数组字段中:
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 } )
https://stackoverflow.com/questions/6074720/