Запрос MongoDB для документов, содержащих хотя бы одно из значений, указанных в массиве

У меня есть коллекция в MongoDB, которая структурирована следующим образом:

[
  {
    "_id": ObjectId("51bf000a3d489f2df59aa4c6"),
    "courses": ["course1", "course2"]
  }, {
    "_id": ObjectId("52cc789a4df828450c16e52c"),
    "courses": ["course3", "course4"]
  }
]

Я хотел бы иметь возможность запрашивать оба документа с помощью массива вроде ["course1", "course3"], где "course1" соответствует первому, а "course3" соответствует второму документу.

Возможно ли это без такого сложного запроса?

{
  "$or": [
    { "courses": "course1" },
    { "courses": "course3" }
  ]
}

Извините за мой плохой английский!


person Till    schedule 16.02.2014    source источник
comment
Если это частый запрос, обязательно добавьте в коллекцию индекс для courses.   -  person WiredPrairie    schedule 16.02.2014


Ответы (2)


Следующий запрос равен вашему:
db.coll.find({ courses: { $in: ["course1", "course3"] } })

person Ivan.Srb    schedule 16.02.2014
comment
Благодарю вас! Я читал об операторе $in, но не знал, что он работает и с массивами. - person Till; 16.02.2014

Если вы хотите продолжить работу с набором результатов, вы также можете использовать агрегаты и настроить результат по своему усмотрению.

db.courses.aggregate([
            {$unwind:"$courses"},
            {$match:{$or:[{courses:"course1"},{courses:"course3"}]}},
            {$project:{_id:0, courses:1}}
    ]);

или используйте оператор $in, как показано ниже:

db.courses.aggregate([
        {$unwind:"$courses"},
        {$match:{courses:{$in:["course1","course3"]}}},
        {$project:{_id:0, courses:1}}
        ])
person Ram Dwivedi    schedule 16.02.2014