文本搜索返回空数组

时间:2019-04-24 14:39:12

标签: node.js mongodb mongoose

当我尝试在mongodb中进行文本搜索时,我的查询返回一个空数组。我已经在数据库中创建了索引。

例如:

我有2种数据类型的String在模型状态中声明,而mac_address都已包含在文本索引中。当我搜索mac_address时,它为我提供了正确的数据,但是当我尝试搜索状态时,它返回了一个空数组。

--Model--

const PhoneSchema = new mongoose.Schema({
  status: {
    type: String, 
    default: "DOWN"
  },
  mac_address: {
    type: String,
    unique: true
  },
});

--Index--
db.phones.createIndex({
  status: "text",
  mac_address: "text"
});

--Route--
router.get('/search/:searchForData',
  async function (req, res) {
    try {
      const searchPhone = await Phone.find({
        $text: {
          $search: req.params.searchForData
        }
      }, {
        score: {
          $meta: "textScore"
        }
      }).sort({
        score: {
          $meta: "textScore"
        }
      })
      res.status(200).json(searchPhone);
    } catch (err) {
      return res.status(404).json({
        error: err.message
      });
    }
  });

db.phones.getIndexes()


[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "pingphony.phones"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "ip" : 1
                },
                "name" : "ip_1",
                "ns" : "pingphony.phones",
                "background" : true
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "mac" : 1
                },
                "name" : "mac_1",
                "ns" : "pingphony.phones",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                },
                "name" : "$**_text",
                "ns" : "pingphony.phones",
                "weights" : {
                        "$**" : 1
                },
                "default_language" : "english",
                "language_override" : "language",
                "textIndexVersion" : 3
        }
]

我希望/ phone / search / DOWN的输出是包含DOWN状态的数据,但是我得到的实际输出是[]

1 个答案:

答案 0 :(得分:0)

  1. 尝试直接从mongo控制台进行查询:

    db.phones.find({$ text:{$ search:“ DOWN”}})

  2. 尝试使用聚合管道:

    const searchPhone =等待Phone.aggregate(    [      {$ match:{$ text:{$ search:“ DOWN”}}},      {$ sort:{分数:{$ meta:“ textScore”}}},    ] );

  3. 如果您尝试了所有操作,但都无法顺利进行,请尝试使用regexp:

    const searchQuery = req.params.searchForData.replace(/ [。* +?^ $ {}()| [] \] / g,'\ $&'); //转义正则表达式符号   const searchPhone = await Phone.find({status:new RegExp(${searchQuery},'i')});