的MongoDB $在多个领域

问题描述:

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

{ 
    "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

您可以$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'})