2016-10-11 2 views
3

Я пытаюсь построить объект запроса MongoDB на основе данных, полученных из формы поиска на стороне клиента. Моя цель - запросить базу данных с любыми и всеми критериями, предоставленными пользователем, в то же время позволяя пользователю оставлять поля поиска пустыми, если они захотят.Динамический запрос MongoDB

Это моя текущая попытка объекта запроса является:

var q = {}; // declare the query object 
    q['$and']=[]; // filter the search by any criteria given by the user 
    if((req.body.learninglanguages).length > 0){ // if the criteria has a value or values 
    q["$and"].push('{learningLanguages: {$in: ' + req.body.learninglanguages.split(",") + '}}'); // add to the query object 
    } 
    if((req.body.spokenlanguages).length > 0){ 
    q["$and"].push('{spokenLanguages: {$in: ' + req.body.spokenlanguages.split(",") + '}}'); 
    } 
    if((req.body.country).length > 0){ 
    q["$and"].push('{country: {$in: ' + req.body.country.split(",") + '}}'); 
    } 
    if((req.body.commethod).length > 0){ 
    q["$and"].push('{comMethod: {$in: ' + req.body.commethod.split(",") + '}}'); 
    } 

Но полученный объект:

{ '$and': 
    [ '{learningLanguages: {$in: Albanian,American Sign Language,Amharic,Arabic,Arabic (Egyptian)}}', 
    '{spokenLanguages: {$in: Akan,Albanian,American Sign Language,Amharic}}', 
    '{country: {$in: Åland Islands}}', 
    '{comMethod: {$in: whatsapp,email,face to face,skype}}' ] } 

Как правильно построить MongoDB $ в запросе от req.body объектов ?

+0

Проконсультировались ли вы с документацией? https://docs.mongodb.com/manual/reference/operator/query/in/ – Derek

+0

У меня есть, но я не могу найти ничего полезного в создании объектов запроса динамически. –

+0

Пожалуйста, не забудьте проверить мой ответ ниже и пометить его правильно, если он соответствует вашим потребностям – Derek

ответ

2

Проблемы с запросом вы пытаетесь построить строку вместо того, чтобы непосредственно строить объект, как MongoDB & мангуста принимает:

var q = {}; // declare the query object 
    q['$and']=[]; // filter the search by any criteria given by the user 
    if((req.body.learninglanguages).length > 0){ // if the criteria has a value or values 
    q["$and"].push({ learningLanguages: {$in: req.body.learninglanguages.split(",") }}); // add to the query object 
    } 
    if((req.body.spokenlanguages).length > 0){ 
    q["$and"].push({ spokenLanguages: {$in: req.body.spokenlanguages.split(",") }}); 
    } 
    if((req.body.country).length > 0){ 
    q["$and"].push({ country: {$in: req.body.country.split(",") }}); 
    } 
    if((req.body.commethod).length > 0){ 
    q["$and"].push({ comMethod: {$in: req.body.commethod.split(",") }}); 
    } 

Вы можете видеть, что вместо того, чтобы нажимать на строке, я вместо этого вставляя прямой объект, который соответствует спецификациям документации.

Смотрите документацию здесь для получения дополнительной информации:

  1. https://docs.mongodb.com/manual/reference/operator/query/and/
  2. https://docs.mongodb.com/manual/reference/operator/query/in/

А вот рабочий jsbin вы можете играть с:

  1. http://jsbin.com/cequbipiso/edit?js,console
+1

помог мне, спасибо – pkpk

1

Я следовал за предложением Дерека, которое является точкой с точки зрения динамического построения условий запроса. Но, похоже, этот код не обрабатывает сценарий, в котором не указаны параметры поиска.

В частности, если все req.body параметры пустые, то у вас есть объект запроса с пустыми $ и массивом, как заявлено здесь:

q['$and']=[]; 

Это приводит к ошибке MongoError: $and/$or/$nor must be a nonempty array.

Вот что я сделал, чтобы решить эту проблему:

var conditions = {}; //declare a conditions object 
var and_clauses = []; //an array for the and conditions (and one for or conditions and so on) 

if((!!req.body.email_id)){ 
    and_clauses.push({ 'email_id': {$regex: req.body.email_id }}); 
} 

if(and_clauses.length > 0){ 
    conditions['$and'] = and_clauses; // filter the search by any criteria given by the user 
} 

//Run the query 
User.find(conditions, 
    function(err, users) { 
     if (err){ 
      console.log(err); 
      res.status(500).send(err); 
     }else{ 
      console.log(users); 
      res.status(200).json(users); 
     } 
}); 

Дерек, извинения, если я что-то не так, не хочу отметить проблему неправильно.

+0

Привет, Vikas, спасибо за добавление дополнительного шага к Дереку. Это хорошо сработало для моего сценария. – user752746

Смежные вопросы