2017-06-14 218 views
0

我想查找名字和姓氏匹配的用戶。

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}); 
}); 

}); 

這個API的例子輸入:

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

錯誤,我從貓鼬得到的是:

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' } 

輸入解析上的貓鼬發現查詢:

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

你使用哪個版本的mongo? – geo

+0

對象無效,您也不需要'$和'。所有的MongoDB查詢參數都已經是AND條件 –

回答

1

你其實並不需要$and因爲所有 MongoDB的查詢參數已經條件:

而是執行此操作:

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'); 
}) 

query輸出看起來像:

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

這當然是你想要的完全有效的陳述。

另請參閱$regex它也接受RegExp在JavaScript環境中生成的對象。

0

你的問題是在這行:

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

要調用_.map通過收集其迭代,但沒有集合存在。它應該是這個樣子:

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

你是不是在你的代碼通過任何迭代,所以query.$and[v.type] = getRegex(v.name);從不執行,所以你的$和數組是空的。

此外,我看不到v正在您的代碼段中定義的位置。

這裏是一個如何_.map運作以及PARAMS收到一些有用的鏈接:

.map in lodash .map in underscore

希望這是幫助。