arrays - 从用户搜索传递值数组时,Mongodb $in 因添加引号而失败
问题描述
我花了很长时间试图找到答案,我已经检查了在提出这个问题时提供的每个建议的答案,所以如果这个问题已经得到解答,很抱歉浪费你的时间。我已经编程 5 年了,并且已经构建了一个 Jquery、PHP、Mysql 应用程序。现在我正在使用节点后端在 Vanilla Javascript 和 MongoDB 中重做这一切。
参数由用户发送并在服务器上编译以制定不同的搜索标准。regArray 采用 Params.Criteria 并将每个名称作为 RegExp 的数组。对于多重模糊搜索,使用 Mongodb 的聚合 $in。失败是因为在将输出 /John/gim、/Jack/gim、/James/gim 传递给 [] 或我尝试过的任何其他方式时添加了外部引号。
注释掉的测试部分有效。
我需要什么:[/John/gim, /Jack/gim, /James/gim](硬编码数组)这返回 2 个文档
我得到了什么:['/John/gim, /Jack/gim, /James/gim'] (动态编码)这失败了
如果有人可以帮助我获得所需的结果,我将非常感激。
这是我的代码,易于测试 - 不需要数据库。
const Params = {
Field: 'FirstName',
Criteria: 'John Jack James',
Seek: { On : false, Case: true},
Tag: { On: false, By: true },
Or: false, Not: true,
ByDate: { Range: false, Year: false, Month: false, Day: false },
}
let regArray = Params.Criteria.split(' ').map((knit) => new RegExp(knit, 'igm')).join(', ')
console.log('regArray: ', regArray);
let findaMatch = ({ $match : { [Params.Field] : { $in : [regArray] } }})
// let test = [/John/gim, /Jack/gim, /James/gim]
// let findaMatch = ({ $match : { [Params.Field] : { $in : test } }})
console.log('findaMatch: ', findaMatch);
解决方案
通过删除 .join() 找到我的答案
let Result = 'John Jack James'.trim().split(' ')
var range = []
for (var i = 0; i < Result.length; i ++ ) {
range.push( new RegExp(Result[i], 'igm') )
}
或者
let regArray = Params.Criteria.split(' ').map((knit) => {
return new RegExp(knit, 'igm')
})
现在我明白了[/John/igm, /Jack/igm, /James/igm]
并不是["/John/igm, /Jack/igm, /James/igm"]
现在它是一个正则表达式值数组,而不是一个无用的字符串。
推荐阅读
- c - C 中的地址 (&) 和间接 (*)
- sql - 具有浮点变量的相同查询的T-SQL不同结果
- azure-devops - 如何将 Azure Webjob 从 Azure DevOps 部署到 wwwroot\App_Data\jobs\triggered\MyWebJob?
- react-navigation - React-Navigation:在两个底部选项卡中使用相同的屏幕
- android - Android 8 - 使用过滤器 com.google.firebase.MESSAGING_EVENT 注册两个不同的服务
- spring-boot - ResouraseServerConfiger 中 antMancher 的动态 url
- python - PyQtGraph:基于值的不同符号或符号颜色
- django - 数据表多搜索过滤器未更新跳过表选项卡
- css - 悬停的 CSS 深层元素
- rest - 经典服务器中的进度 REST PUT 返回错误