如果我有一个包含以下架构的集合:
{
"author": …,
"title": …,
"pages": …,
"publishDate": …,
}
其中author
和title
是复合索引的一部分。
我想查找作者和标题可能是以下内容之一的所有文档:
"Melville", "Moby Dick"
"Orwell", "1984"
"Tolkien", "The Hobbit"
如何使用"$in"
声明执行此操作?我可以用"$or"
来做,但表现是灾难性的。
答案 0 :(得分:3)
如果您更改架构以将该对键放入单独的子文档中,则可以使用$in
执行此操作:
{key: {author: 'Melville', title: 'Moby Dick'}, ...},
{key: {author: 'Orwell', title: '1984'}, ...},
{key: {author: 'Tolkien', title: 'The Hobbit'}, ...}
这样您就可以$in
执行key
查询:
db.test.find({key: {$in: [
{author: 'Melville', title: 'Moby Dick'},
{author: 'Orwell', title: '1984'},
{author: 'Tolkien', title: 'The Hobbit'}
]}})
请注意,author
和title
字段的顺序非常重要,因此请务必使用一致的字段排序。
要使其具有高效性,您可以在key
上添加唯一索引:
db.test.createIndex({key: 1}, {unique: true})
或者,如果您不需要索引来强制执行唯一性,则创建hashed index可能更有效:
db.test.createIndex({key: 'hashed'})