【问题标题】:How to do contain search in Nodejs And Mongodb如何在 Nodejs 和 Mongodb 中包含搜索
【发布时间】:2017-04-15 21:37:30
【问题描述】:

NodeJS

search_key = new RegExp('.*' + req.params.search_key + '.*', 'i');
Item.find({product_name:search_key}).exec(function (err, items) {
    console.log(items) );
});

在这里我可以使用 search_key 搜索产品名称。但我的问题是,我的产品名称是“COMPLAN MILK BISCUITS 100GM”。如果我使用“BISCUITS COMPLAN”搜索,则找不到该产品。我需要根据搜索中的包含找到“BISCUITS COMPLAN”和“COMPLAN BISCUITS”。

【问题讨论】:

  • 不确定您的要求。您希望“BISCUITS COMPLAN”找到所有包含 BISCUITS 或 COMPLAN 的产品?还是两者都没有具体顺序?
  • @SimonPA 我有一个商品名为 complan 牛奶饼干 100gm。如果我用关键字 Complan 搜索,它会得到该商品。但如果我用 Biscuits Complan 搜索,它没有找到那个项目。如果我们使用关键字 Biscuits Complan 进行搜索,我需要找到该项目。
  • 由于您明确搜索“search_key”somewhere(这就是您在形成正则表达式之前和之后添加 .* 时所做的),您将永远无法将“complan milk biscuits 100gm”与该字符串不包含的搜索词匹配。

标签: regex node.js mongodb mongoose mongodb-query


【解决方案1】:

您需要创建文本索引以实现您的目标,然后从文本索引字段中搜索。 mongo shell 命令为product_name 字段创建text index

db.colectionName.createIndex( { product_name: "text" } );

然后您可以使用 $text$search 进行搜索。 doc

db.collectionName.find({ $text: { $search: "BISCUITS COMPLAN" } });

不需要使用new RegExp(,可以使用like:

Item.find({ $text: { $search: req.params.search_key } }).exec(function (err, items) {
    console.log(items) );
});;

【讨论】:

    【解决方案2】:

    您需要为此使用$text 运算符。

    所以而不是:

    Item.find({product_name: search_key})...
    

    类似:

    Item.find({product_name: {$text: {$search: search_key}}})...
    

    注意:您需要有一个text index

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 2021-01-21
      • 2013-09-15
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多