Mongodb $in从用户搜索传递值数组时添加引号的失败

Mongodb $in failure from added quotes when passing Array of values from a User Search

提问人:Ryan 提问时间:2/17/2021 更新时间:2/18/2021 访问量:77

问:

我花了很长时间试图找到一个答案,我已经检查了在提出这个问题时提供的每一个建议的答案,所以如果这个问题已经得到回答,很抱歉浪费你的时间。我已经编程了 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);

数组 MongoDB 动态 报价

评论


答:

0赞 D. SM 2/17/2021 #1

无论你想做什么,都需要重做。MQL(MongoDB查询语言)中没有任何东西接受数组作为这样的键。[Params.Field]

评论

0赞 Ryan 2/17/2021
它只是通过API发送的搜索参数,然后这些参数被制定到Mongodb Aggregation中。在客户端执行此操作存在安全风险,我需要一种方法来传递大量选项,而不会轰炸 URL。在搜索栏中,用户将输入多个单词,每个单词都会被搜索。如果没有 Mongodb,我本可以问这个问题,但我觉得最好提供上下文。 = 'FirstName' 感谢您的回复。[Params.Field]
0赞 D. SM 2/18/2021
不明白你想做什么但这不是MongoDB所理解的。将数组作为键传递是虚假的/毫无意义的。
0赞 Ryan 2/18/2021
让我解释一下:{FirstName : 'something'} 这里 firstname 是字面意思。{key : '某物'}此处的键是按字面意思取的,而不是解析 FirstName。{[key] : '某物'}这里的键是一个变量,而不是使用方括号的字面意思,但这与我的问题无关。
0赞 Ryan 2/18/2021 #2

通过删除 .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"]

现在它是一个正则表达式值的数组,而不是一个无用的字符串。