2014-02-16 1 views
0

у меня есть коллекция в MongoDB, которая строится так:MongoDB запрос для документов, которые содержат по меньшей мере одно из значений, указанных в массиве

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

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

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

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

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

+0

Если это частый запрос, убедитесь, что добавить индекс для 'courses' в коллекцию. – WiredPrairie

+0

Да, конечно! – Till

ответ

0

После запроса равно к вашему:
db.coll.find({ courses: { $in: ["course1", "course3"] } })

+0

Спасибо! Я читал об операторе '$ in', но не знал, что он работает и с массивами. – Till

0

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

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

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

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