使用MongoDB查询在字符串中搜索多个单词/子字符串?

使用MongoDB查询在字符串中搜索多个单词/子字符串?,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,我有一个模型,如图所示 [ {"_id": "1", "Title": "boat test"}, {"_id": "2", "Title": "mobiles and extras"} ] Query\u String=“boat”//应返回[{u id:“1”,“Title:“boat test”}] Query\u

我有一个模型,如图所示

[
    {"_id": "1", "Title": "boat test"},
    {"_id": "2", "Title": "mobiles and extras"}
]
Query\u String=“boat”
//应返回[{u id:“1”,“Title:“boat test”}]

Query\u String=“boat te”
//应返回[{“\u id”:“1”,“Title”:“boat test”}]

Query\u String=“mobiles”
//应返回[{“\u id”:“2”,“Title”:“mobiles and extras”}]

Query\u String=“mob”
//应返回[{“\u id”:“2”,“Title”:“mobiles and extra”}]

Query\u String=“boat mobile”
//应该返回[{u id:“1”,“Title:“boat test”},{{u id:“2”,“Title:“mobiles and extra”}]

我的查询是获取其“Title”字段在给定查询字符串中包含任何单词的所有产品

我尝试了这个方法,但这只适用于第一个查询字符串为“boat”的情况


有两种方法

使用javascript RegExp:

  • 按空格拆分字符串并生成数组,映射以将字符串转换为正则表达式
  • 请尝试在$in查询表达式中包含正则表达式,您只能使用JavaScript正则表达式对象(即/pattern/)。例如:
使用
$or
条件和
$regex

  • 按空格拆分字符串并制作数组,映射到单独的条件准备数组
  • 检查
    $或
    条件

我试过了,结果非常好<代码>让TitleFilter=req.body.Title.split(“”.map((s)=>{return{Title:{$regex:s,$options:“i”,},};})
const product=wait Products.find({$or:TitleFilter})//这返回了预期的输出,但如果我还想检查同一查询的类别字段,该怎么办。。。。例如,现在我只检查标题字段。如果我想同时检查标题和类别字段,该怎么办;对于多个字段。我已使用类别条件更新了答案。我使用第二种方法解决我的问题。它工作得非常好。谢谢我们也可以在这里使用spread运算符来连接两个Arar,如下所示
[…TitleFilter,…CategoryFilter]
完美答案!
const { Products } = require("../models/Products");

Products.find({
      Title: {
        $regex: `.*${Query_String}.*`,
        $options: "i",
      },
    })
let QString = Query_String.split(" ").map(s => new RegExp(s));
Products.find({
  $or: [
    { Title: { $in: QString } },
    // more fields if needed
    { Category: { $in: QString } }
  ]  
});
let QStringTitle = Query_String.split(" ").map(s => { 
  return {
    {
      Title: {
        $regex: s,
        $options: "i"
      }
    }
  };
});
let QStringCategory = Query_String.split(" ").map(s => { 
  return {
    {
      Category: {
        $regex: s,
        $options: "i"
      }
    }
  };
});
Products.find({ $or: QStringTitle.concat(QStringCategory) });