我想根据我构建的正则表达式查询MongoDB文档。例如 我已经构建了一个简单的正则表达式,它是一个随机字母和一个随机数的组合,用于Nodejs
var randnum = Math.floor((Math.random() * 10) + 1);
var alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z'];
var randletter = alpha[Math.floor(Math.random() * alpha.length)];
var val = randletter + randnum + '.*;
我已经为正则表达式变量尝试了各种组合,如
var stream = collection.find({"FirstName": /val/).stream();
&&
var stream = collection.find({"FirstName": /$val/).stream();
&&
var stream = collection.find({"FirstName": {$in : [{$regex:val}]}}).stream()
&&
var stream = collection.find({"FirstName": {$in : [{$regex:$val}]}}).stream()
没有,它似乎工作。但是当我写实际的正则表达式时,我得到了例如
的记录var stream = collection.find({"FirstName": /J.*/).stream();
任何帮助将不胜感激。
由于 内甚
答案 0 :(得分:30)
您需要使用RegExp
构造函数从字符串创建正则表达式对象,因为/.../
语法仅用于文字。
var stream = collection.find({"FirstName": new RegExp(val)}).stream();
答案 1 :(得分:5)
使用以下代码在regex中使用动态值或使用
{$match: { $or: [{ 'title': { $regex: request.query.val, $options: 'i'} }, { 'skills_required': { $regex: request.query.val, $options: 'i'} }] }},
答案 2 :(得分:3)
我的标题遇到了同样的问题,经过大量的搜索,我找到了这个答案Here,
var search = 'Joe';
db.users.find(name: /^search/)
db.users.find(name: {$regex: /^search/});
db.users.find(name: {$regex: "/^" + search + "/"});
上述查询不会返回任何内容。这个小问题的解决方案非常简单:
db.users.find(name: new RegExp(search)) //For substring search, case sensitive.
db.users.find(name: new RegExp('^' + search + '$')) //For exact search, case sensitive
db.users.find(name: new RegExp(search, ‘i')) //For substring search, case insensitive
db.users.find(name: new RegExp('^' +search + '$', 'i')); //For exact search, case insensitive
可以根据此处的引用添加其他标志或属性
答案 3 :(得分:3)
如果您的正则表达式包含一个变量,请确保escape它。
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
可以这样使用
new RegExp(escapeRegExp(searchString), 'i')
或者在像这样的 mongoDb 查询中
{ '$regex': escapeRegExp(searchString) }
发表了相同的评论here
答案 4 :(得分:2)
如果您想使用变量 val 作为查询部分的参数,可以使用 $ regex ,例如:
collection.find({"FirstName": {$regex:val}})
根据手册,不允许在 $ in 运算符中加入 $ regex 。
如果要将正则表达式对象放在 $ in 运算符中,则必须使用JavaScript正则表达式对象,例如:
collection.find({"FirstName": {$in: [/abc/, /123/]}})
顺便说一下,/val/
中的 val 是常量字符串,而不是上面定义的变量。
答案 5 :(得分:1)
let test = `what your regex should
search`;
collection.find({
fieldName: {$regex: test}
}).then(result => red.send(result));
//在mongoose上测试过,但也应该在mongodb上工作