2011-05-20 150 views
5

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

我应该使用MapReduce吗?如果我使用embebed string []对象,为了只选择标签,对于自动完成功能?怎么样?

谢谢!

+0

[MongoDB的架构设计的可能重复博客](http://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs) – 2011-05-20 16:40:27

+0

[如何在Mongo中实现post标签?](http://stackoverflow.com/questions/ 8455685/how-to-implement -post-tags-in-mongo) – 2015-02-11 23:29:55

回答

5

我可能会用这样的模式,它存储了标签的字符串数组现场去:

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

问题在于,当我只需要自动完成标签时,就选择了空洞电影对象。你确定这更快吗? – elranu 2011-05-22 14:38:15

+5

这似乎并没有真正回答他的问题。你将如何获得在整个电影集合中使用的独特标签清单? – efdee 2012-01-03 14:28:52

+0

这将为您提供一个清晰的标签列表:'db.test.distinct('tags')' – Pek 2016-07-22 10:27:05