2015-09-26 211 views
3

如果我有以下模式的集合:

{ 
    "author": …, 
    "title": …, 
    "pages": …, 
    "publishDate": …, 
} 

其中authortitle是一個複合索引的一部分。

我想找到它的作者和標題可能是下列之一的所有文件:

"Melville", "Moby Dick" 
"Orwell", "1984" 
"Tolkien", "The Hobbit" 

我如何使用"$in"聲明它做什麼?我可以用"$or"這樣做,但表現是災難性的。

+0

'$或'是你如何做到這一點的,所以如果使用它的性能不好,你的複合指數可能不會被使用。你用'explain()'來檢查它嗎? – JohnnyHK

+0

是的,它使用索引。但是對於10000個字段對,MongoDB只會崩潰 –

+0

10,000!哇,用'$或'確實會很慢。你想做什麼?也許還有另一種方法來解決這個問題。 – JohnnyHK

回答

3

您可以$in如果改變模式,以把該對密鑰到一個單獨的子文檔做到這一點:

db.test.find({key: {$in: [ 
    {author: 'Melville', title: 'Moby Dick'}, 
    {author: 'Orwell', title: '1984'}, 
    {author: 'Tolkien', title: 'The Hobbit'} 
]}}) 

{key: {author: 'Melville', title: 'Moby Dick'}, ...}, 
{key: {author: 'Orwell', title: '1984'}, ...}, 
{key: {author: 'Tolkien', title: 'The Hobbit'}, ...} 

這樣,你可以在key執行$in查詢

請注意,authortitle字段的順序非常重要,因此請務必使用一致的字段順序。

爲了使高性能,可以在key添加唯一索引:

db.test.createIndex({key: 1}, {unique: true}) 

或者,如果你不需要索引強制唯一性,它可能是更有效地創建一個hashed index代替:

db.test.createIndex({key: 'hashed'})