5

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

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

谢谢!

4

2 回答 2

6

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

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 的多键功能,并使用单个find()查询查找具有给定标签的电影,如下所示:

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

就像您说的,还值得向多键数组添加索引以提高查询性能:

db.movies.ensureIndex( { tags: 1 } )
于 2011-05-21T01:25:28.713 回答
2

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

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

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

于 2011-05-22T22:35:18.200 回答