2011-05-20 152 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