MongoDB $ in用于多个字段

时间:2015-09-26 19:02:51

标签: mongodb

如果我有一个包含以下架构的集合:

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

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

我想查找作者和标题可能是以下内容之一的所有文档:

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

如何使用"$in"声明执行此操作?我可以用"$or"来做,但表现是灾难性的。

1 个答案:

答案 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'}
]}})

请注意,authortitle字段的顺序非常重要,因此请务必使用一致的字段排序。

要使其具有高效性,您可以在key上添加唯一索引:

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

或者,如果您不需要索引来强制执行唯一性,则创建hashed index可能更有效:

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