2016-12-15 5 views
0

У меня есть один документ, как это:MongoDB фильтр внутренний массив объекта

-document: users- 
{ 
"name": "x", password: "x" recipes: 
[{title: eggs, dificult: 1},{title: "pizza" dificult: 2}], 
name: "y", password: "y" recipes: [{title: "oil", dificult: 2},{title: "eggandpotatoes" dificult: 2}] 
} 

Я хочу, чтобы получить все рецепты фильтрации по названию и dificult

Я попробовал некоторые, как этот

db.users.find({$and: [{"recipes.title": /.*egg.*/},{"recipes.dificult": 2}]}, 
{"recipes.title": 1,"recipes.dificult": 1}).toArray(); 

это должно быть возвращено

{title: "eggandpotatoes" dificult: 2} 

но вернуть

{title: eggs, dificult: 1} 
{title: "eggandpotatoes" dificult: 2} 

Я хотел бы еще фильтр работает, ограничить результат с началом: 2 и конец: 5 возвращение из 2 результата следующих 5.

Спасибо заранее.

ответ

1

Вы можете использовать агрегацию в $filter фильтровать рецепты и $slice ограничить результаты. Это даст вам все, что вы ожидаете, но поиск регулярных выражений, который пока невозможен.

db.users.aggregate([{ 
    $project: { 
     _id: 0, 
     recipes: { 
      $slice: [{ 
       $filter: { 
        input: "$recipes", 
        as: "recipe", 
        "cond": { 
         $and: [{ 
          $eq: ["$$recipe.title", "eggandpotatoes"] 
         }, { 
          $eq: ["$$recipe.dificult", 2] 
         }] 
        } 
       } 
      }, 2, 3] 
     } 
    } 
}]); 
0

Если вам необходимо выяснить, регулярное выражение в title затем использовать $elemMatch, как показано ниже:

db.users.find({"recipes":{"$elemMatch":{"title": /.*egg.*/,"dificult": 2}}}, {"recipes.$":1}) 

Одна вещь, которую я упомянул здесь, если ваш recipes массив содержит некоторые вещи, как этот

"recipes" : [ { "title" : "egg", "dificult" : 2 }, { "title" : "eggand", "dificult" : 2 } ]

затем $ проекция возврат только первый соответствует objcect массив в описанном выше случае это будет

"recipes" : [ { "title" : "egg", "dificult" : 2 } ]

Если вам это нужно как массив затем перейти к @Sagar ответ, используя агрегацию