我想找到名字和姓氏匹配的用户。
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"
}
]
}
我从mongoose得到的错误是:
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' }
在mongoose查询查询上解析的输入是:
{ '$and':
[ first_name:{ '$regex': '^suresh|.*suresh', '$options': 'i' },
last_name:{ '$regex': '^pattu|.*pattu', '$options': 'i' }
]
}
答案 0 :(得分:1)
您实际上不需要$and
,因为所有 MongoDB查询参数已经 AND 条件:
请改为:
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 }
这当然是你想要的完美有效的陈述。
答案 1 :(得分: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
如何运作以及收到的参数的一些有用链接:
.map in lodash .map in underscore
希望这有帮助。