2016-06-07 3 views
2

Я пытаюсь проверить свою коллекцию, чтобы вернуть все документы, где элемент массива в документе является определенным значением.Как найти элемент в документе - MongoDB?

Например, вот один из моих документов JSON:

[ 
{ 
    "employer" : "[email protected]", 
    "applicants" : [ 
     { 
      "email" : "[email protected]" 
     }, 
     { 
      "email" : "[email protected]" 
     } 
    ] 
}, 
{ 
    "employer" : "[email protected]", 
    "applicants" : [ 
     { 
      "email" : "[email protected]" 
     } 
    ] 
}, 
{ 
    "employer" : "[email protected]", 
} 
] 

Теперь, что я хотел бы Возвращается любой документ, в котором массив соискатели не содержит электронную почту "[email protected]" OR, где есть no applicants array.

В моем примере JSON выше, он должен вернуть документы для employer1 и .

Я дошел до того, что возвратил документы, где заявитель [email protected] does not exist, поэтому работодатель1, но я не понимаю, как я могу также включить employer3. Как я могу это сделать?

Это мой запрос до сих пор в JavaScript:

collection.find({"applicants.email" : {$ne : req.user.username}}, {}, function(e,docs){ 
      res.json(docs); 
      console.log(docs); 
    }); 
+0

Использование $ elemMatch найти объект в массиве, как это '{претендентам: {$ elemMatch: {адрес электронной почты: {$ пе: req.user. email}}}} ' – Molda

+0

Это не работает, оно возвращает []. Если я добавлю «заявителей»: [] в мой документ, у исходного запроса у меня были работы, но я не думаю, что мне нужно было бы добавить пустой массив, чтобы получить эту работу, должен ли я? – user2573690

+1

Хм, странно, я не могу проверить это сейчас. Затем попробуйте исходный запрос: {$ или: [{"претенденты: $ или: [{$ exists: false}, {$ size: 0}], {" applicants.email ": {$ ne: req.user .username}]} 'this должно возвращать документы, в которых массив заявителей не существует или пуст, или письмо не является req.user.username – Molda

ответ

1

Попробуйте следующий запрос, который может помочь вам: -

См $size для получения дополнительной информации о том, как его использовать.

Этот запрос будет возвращать результаты, если applicants.email не равно req.user.username ИЛИ если applicants размер массива равен 0.

collection.find({$or:[ 
        {"applicants.email" : {$ne : req.user.username}}, 
        {applicants: {$size: 0}} 
       }], function(e,docs){ 
     console.log(docs); 
}); 

Я никогда не пробовал запроса. Дайте мне знать, если она дает какие-либо ошибки.

Также вы можете попробовать это: -

Этот запрос будет возвращать результаты, если applicants.email не равный req.user.username ИЛИ если applicants массива нет.

collection.find({$or:[ 
        {"applicants.email" : {$ne : req.user.username}}, 
        {applicants: {$exists: false}} 
       }], function(e,docs){ 
     console.log(docs); 
}); 

См $exists для получения дополнительной информации.

Надеюсь, это поможет.

+0

Спасибо! Я придумал второй вариант, который вы разместили, и это сработало ! – user2573690

+0

Рад помочь вам! Можете ли вы поддержать ответ, если это поможет? :) – Shrabanee

0

Попробуйте:

collection.find({applicants: {$not: {$size: 0}}},function(err,data){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     console.log("Applicats Array Where size is not zero:"); 
     console.log(data); 
    } 
}); 
0

просто попробуйте этот запрос, $nin полезен для этого условия

collection.find({"applicants.email" : {$nin:["[email protected]"]}}, {}, function(e,docs){ 
      res.json(docs); 
      console.log(docs); 
    }); 
Смежные вопросы