Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB通过regex跟踪集合中的索引,不区分大小写_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript MongoDB通过regex跟踪集合中的索引,不区分大小写

Javascript MongoDB通过regex跟踪集合中的索引,不区分大小写,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我在MongoDB中使用各种索引集合,在那里我从一个简单的搜索引擎进行查询。 问题的关键是,我找不到在不区分大小写的中执行这些正则表达式查询的方法,即查询的集合不遵循索引 情况是这样的:(这样索引后面跟着集合就没有问题了) 我已经尝试了所有可能的方法,但我无法获得预期的结果,也无法找到我的问题的特定信息,我尝试了以下方法: collection3.find({$or:[{ firstname: new RegExp('^' +query+ '$', 'i')}, ...... collectio

我在MongoDB中使用各种索引集合,在那里我从一个简单的搜索引擎进行查询。 问题的关键是,我找不到在不区分大小写的中执行这些正则表达式查询的方法,即查询的集合不遵循索引

情况是这样的:(这样索引后面跟着集合就没有问题了

我已经尝试了所有可能的方法,但我无法获得预期的结果,也无法找到我的问题的特定信息,我尝试了以下方法:

collection3.find({$or:[{ firstname: new RegExp('^' +query+ '$', 'i')}, ......
collection3.find({$or:[{ firstname: new RegExp('^' +query,'i')}, ......
collection3.find({$or:[{ firstname: { $regex: query, $options: 'i' }},......
collection3.find({$or:[{ firstname: { $regex: new RegExp(`^${query}$`), $options: 'i'}},......
我还尝试以各种方式将其与变量绑定,包括:

var value = '^'+query;
var value = /^query/i;
` 简而言之,因为似乎没有 解决方案我将感谢任何帮助我的人

处理这个问题的其他方法也很好 谢谢

试试这个:

var query = req.query.name;

function(callback) {
  collection3.find({
    $or:[
      {
        "firstname": {
          "$regex": `^${query}$`,
          "$options": "i"
        }
      },
      {
        "email": {
          "$regex": `^${query}$`,
          "$options": "i"
        }
      }
    ]
  }).toArray(function(err, result3){ 
    if (err) return callback(err);
    locals.result3 = result3;
    callback();
  });
}

这里有一个工作片段:

如果您只需要不区分大小写的搜索,请使用。创建排序规则不区分大小写的索引:

collection3.createIndex({name: 1},{collation: {locale: "en", strength: 1, caseLevel: false}} ) 
collection3.createIndex({name: 1},{collation: {locale: "en", strength: 1, caseLevel: false}} ) 
并在查询时使用相同的排序规则:

collection3.find({$or:[{name:query},{email:query}]}).collation({locale:"en",strength:1,caseLevel:false})

更新

对于那些发现自己遇到类似问题的人,我临时解决了(根据我的需要),在req.query.name中发出请求之前,自动将名称的首字母设置为大写 (幸运的是,名字都以大写字母开头)

随后,我在新的RegExptoTitleCase(value)中添加了“^”+query以代替

这样,即使我在搜索栏中使用小写req.query.name中的请求也只使用大写和每个单词开头的第一个字母。 保留不变的电子邮件,因为它们强制使用小写, 整个系统完全遵循索引

我很幸运,因为我有这样的语法(第一个字母总是大写),因此绕过了这个问题,否则另一个想法是将整个数据库在根位置恢复为小写!至少就我所知,到目前为止还没有解决这个问题的办法,这让我感到惊讶

PS:如果你有任何其他想法,欢迎!
谢谢

谢谢你的回复,不幸的是,它也没有以这种方式跟随索引:(我更新了我的ANWSER。您能再试一次吗?它现在应该工作了。不幸的是,没有考虑$选项:‘i’,‘$ReEX’:<代码> ^ ${Que}}$ /Case>似乎起作用,但大小写敏感,有$选项:‘i’不想跟随索引。除了从头重新创建索引之外,我不知道该怎么做:(难以置信,我没想到在mongodb中已经创建了一个集合的索引之后,没有办法使用不区分大小写的正则表达式!我希望有人能帮我找到正确的方法!谢谢你等等…这是我刚刚创建的工作代码段:。我也会将它添加到答案中。你能检查一下吗?好的,谢谢你,我一定会尝试的。)重新创建索引!我想知道是否有办法运行集合。使用已创建的索引查找不区分大小写的索引!由于数据太多,而且从Scratch中重新创建所有集合索引需要很长时间。如果查询始终不区分大小写,则最好在创建索引时分配排序规则收集,以便自动应用,但这意味着重新加载所有数据。不幸的是,以这种方式,它无法使用正则表达式!有一个问题……我将放弃使用mongodb!但是强度必须设置为2,不区分大小写,再次感谢!当我作为正则表达式提交查询时,解释计划说它正在使用索引。也不确定为什么强度1不适合你。
collection3.find({$or:[{name:query},{email:query}]}).collation({locale:"en",strength:1,caseLevel:false})
var query = req.query.name;
var value = '^'+query;
function toTitleCase(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}

.............
.............
function(callback) {
  collection3.find({$or:[{ firstname: new RegExp(toTitleCase(value))},
  { email: new RegExp('^'+query)}]}).toArray(function(err, result3){ 
    if (err) return callback(err);
     locals.result3 = result3;
     callback();
  });
 },
 .........
 .........