2017-06-14 4 views
0

Ich möchte einen Benutzer finden, wo Vorname und Nachname übereinstimmt.

router.post('/post/user/search/tag', function (req, res) { 

function getRegex(_query) { 
    return { 
     $regex: '^' + _query + '|.*' + _query, 
     $options: "i", 
    }; 
} 

var query = {}; 
query.$and = []; 

_.map(req.body.params, function(_obj){ 
    query.$and[v.type] = getRegex(v.name); 
}); 

User.find(query).exec(function (err, docs) { 
res.json({err: false, data: docs}); 
}); 

}); 

Beispiel Eingabe für diesen api ist:

{"params": 
    [ 
    { 
     "name":"suresh", 
     "type":"first_name" 
    }, 
    { 
     "name":"pattu", 
     "type":"last_name" 
    } 
    ] 
} 

Fehler ich von Mungo bin immer ist:

undefined { MongoError: $and/$or/$nor must be a nonempty array 
    at Function.MongoError.create (/Users/user/code/project/trainer-ville-admin/node_modules/mongodb-core/lib/error.js:31:11) 
    at queryCallback (/Users/user/code/project/trainer-ville-admin/node_modules/mongodb-core/lib/cursor.js:212:36) 
    at /Users/user/code/project/trainer-ville-admin/node_modules/mongodb-core/lib/connection/pool.js:469:18 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
    name: 'MongoError', 
    message: '$and/$or/$nor must be a nonempty array', 
    ok: 0, 
    errmsg: '$and/$or/$nor must be a nonempty array', 
    code: 2, codeName: 'BadValue' } 

Eingang analysiert auf Mungo finden Abfrage:

{ '$and': 
    [ first_name:{ '$regex': '^suresh|.*suresh', '$options': 'i' }, 
    last_name:{ '$regex': '^pattu|.*pattu', '$options': 'i' } 
    ] 
} 
+0

Welche Version von Mongo verwenden Sie? – geo

+0

Die Objekte sind nicht gültig und Sie brauchen auch nicht $ und. Alle MongoDB-Abfrageargumente sind bereits UND-Bedingungen –

Antwort

1

Sie brauchen eigentlich nicht $and seit alle MongoDB Abfrage Argumente sind bereits UND Bedingungen:

diese stattdessen tun:

var input = { 
    "params" : [ 
      { 
        "name" : "suresh", 
        "type" : "first_name" 
      }, 
      { 
        "name" : "pattu", 
        "type" : "last_name" 
      } 
    ] 
}; 



var query = { }; 
input.params.forEach(p => { 
    query[p.type] = new RegExp('^'+ p.name + '|.*' + p.name, 'i'); 
}) 

Der Ausgang in query wie folgt aussieht:

{ "first_name" : /^suresh|.*suresh/i, "last_name" : /^pattu|.*pattu/i } 

Das ist natürlich die vollkommen gültige Aussage, die Sie wollen.

Siehe auch $regex, die auch RegExp generierte Objekte in einer JavaScript-Umgebung akzeptiert.

0

Ihr Problem ist in dieser Zeilen:

_.map(function(_obj){ 
    query.$and[v.type] = getRegex(v.name); 
}); 

Du _.map die eine Auflistung durchläuft Aufruf aber es gibt es keine Sammlung. Es sollte wie folgt aussehen:

_.map(someCollection, function(_obj) { 
    query.$and[v.type] = getRegex(v.name); 
}); 

Sie nicht in Ihrem Code durch nichts iterieren, so wird query.$and[v.type] = getRegex(v.name); nie ausgeführt, so dass Ihr $ und Array leer ist.

Auch ich sehe nicht, wo v in Ihrem Schnipsel definiert ist.

Hier einige nützliche Links wie _.map funktioniert und was params sie erhält:

.map in lodash .map in underscore

Hope this von Hilfe ist.