提问人:Ryan 提问时间:2/17/2021 更新时间:2/18/2021 访问量:77
Mongodb $in从用户搜索传递值数组时添加引号的失败
Mongodb $in failure from added quotes when passing Array of values from a User Search
问:
我花了很长时间试图找到一个答案,我已经检查了在提出这个问题时提供的每一个建议的答案,所以如果这个问题已经得到回答,很抱歉浪费你的时间。我已经编程了 5 年,并构建了一个 Jquery、PHP、Mysql 应用程序。现在,我正在使用节点后端在 Vanilla Javascript 和 MongoDB 中重做这一切。
参数由用户发送,并在服务器上编译,以制定不同的搜索条件。 regArray 采用 Params.Criteria 并创建一个数组,每个名称作为正则表达式。对于多重模糊搜索,请使用 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);
答:
无论你想做什么,都需要重做。MQL(MongoDB查询语言)中没有任何东西接受数组作为这样的键。[Params.Field]
评论
[Params.Field]
通过删除 .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"]
现在它是一个正则表达式值的数组,而不是一个无用的字符串。
评论