的MongoDB $在多个领域
问题描述:
如果我有以下模式的集合:
{
"author": …,
"title": …,
"pages": …,
"publishDate": …,
}
其中author
和title
是一个复合索引的一部分。
我想找到它的作者和标题可能是下列之一的所有文件:
"Melville", "Moby Dick"
"Orwell", "1984"
"Tolkien", "The Hobbit"
我如何使用"$in"
声明它做什么?我可以用"$or"
这样做,但表现是灾难性的。
答
您可以$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
查询
请注意,author
和title
字段的顺序非常重要,因此请务必使用一致的字段顺序。
为了使高性能,可以在key
添加唯一索引:
db.test.createIndex({key: 1}, {unique: true})
或者,如果你不需要索引强制唯一性,它可能是更有效地创建一个hashed index代替:
db.test.createIndex({key: 'hashed'})
'$或'是你如何做到这一点的,所以如果使用它的性能不好,你的复合指数可能不会被使用。你用'explain()'来检查它吗? – JohnnyHK
是的,它使用索引。但是对于10000个字段对,MongoDB只会崩溃 –
10,000!哇,用'$或'确实会很慢。你想做什么?也许还有另一种方法来解决这个问题。 – JohnnyHK