首页 > 解决方案 > 从用户搜索传递值数组时,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);

标签: arraysmongodbdynamicquotes

解决方案


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

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


推荐阅读