2016-04-20 2 views
0

У меня есть база данных в Mongodb, заполненная профилями с разными навыками.Поиск в Mongoose с определенными параметрами

Вот пример одного профиля.

{_id: 570b8b5afdcaf27c24a0a837, 
    identifier: 'Mr X', 
    url: 'https://MRX.com', 
    email: '[email protected]' 
skills: 
    [ { _id: 570b8b5afdcaf27c24a0a858, title: 'Java', number: '74' }, 
    { _id: 570b8b5afdcaf27c24a0a857, title: 'Linux', number: '48' }, 
    { _id: 570b8b5afdcaf27c24a0a856, title: 'C++', number: '43' }, 
    { _id: 570b8b5afdcaf27c24a0a855, title: 'SQL', number: '34' }, 
    { _id: 570b8b5afdcaf27c24a0a854, title: 'XML', number: '28' }, 
    { _id: 570b8b5afdcaf27c24a0a853, title: 'MySQL', number: '23' }, 
    { _id: 570b8b5afdcaf27c24a0a852, title: 'C', number: '22' }, 
    { _id: 570b8b5afdcaf27c24a0a851, 
     title: 'Java Enterprise Edition', 
     number: '18' }] 
} 

Мой вопрос: есть ли запрос в мангусты, где я могу найти профиль, который имеет Linux в своих навыках, но и количество этого Linux умение больше, чем 40?

Я пытался что-то вроде этого в опции ознакомительной:

var x = { 
    'skills.title': 'Linux', 
    'skills.number': { 
     $gt: 40 
    }, 
} 

, но он не работает, программа находит свое мастерство Linux, но число 40 не связан с Linux.

Есть ли запрос для решения моей проблемы?

ответ

2

Применение $elemMatch:

db.yourCollection.find(
    { skills: { $elemMatch: { title: "Linux", number: { $gte: 40 } } } } 
) 

взяты из docs:

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

+0

Это похоже на работу, когда я положил число равным 40, но когда я хочу, чтобы это было больше, чем 40, я получаю все профили равно или больше или меньше 40. Вы случайно не знаете, почему? –

+1

Убедитесь, что ваш 'number' является числом, а не строкой (без кавычек) – Komo

-2

В мангусте вы должны сделать что-то вроде этого:

var myCol = require('.myModel'); 
myCol.aggregate(
    [ 
     {$match: 
      { 
       title: "Linux", 
       number: { $gte: 40 } 
      } 
     } 
    ], function (err, result) { 
     if (err) { 
      console.log(err); 
     } else { 
      console.log(result); 
     } 
    });