如何在 mongoDB 或 mongoose 中进行部分搜索?

Posted

技术标签:

【中文标题】如何在 mongoDB 或 mongoose 中进行部分搜索?【英文标题】:How to do partial search in mongoDB or mongoose? 【发布时间】:2020-04-18 22:34:07 【问题描述】:

我的用户模型架构是

const userSchema = new mongoose.Schema(
  
  firstname: 
    type: String,
    required: true,
    trim: true
  ,
  lastname: 
    type: String,
    trim: true
  ,
  email: 
    type: String,
    unique: true,
    required: true,
    trim: true,
    lowercase: true
  ,
  password: 
    type: String
  ,
  phone: 
    type: Number,
    trim: true,
    unique: true,
    sparse: true
  
);

我已经为多个字段(名字、姓氏、电子邮件)中的文本搜索建立了索引

userSchema.index(firstname: 'text', lastname: 'text', email: 'text', default_language: 'none');

现在我在用户中搜索“alex”-

const result = await User.find($text :  $search: 'alex' ).skip(1).limit(1);

当我搜索像“alex”这样的整个单词时,我得到了结果,但是如果我搜索“al”,那么我什么也得不到。

所以我想在搜索像“al”这样的部分单词时得到结果,然后我在结果中也得到了“alex”记录。

有人建议使用这个

let searchText = "l";

let condition =  $or: [ firstname: new RegExp("^" + searchText, "i") ,  lastname: new RegExp("^" + searchText, "i") ] 

const result = await User.find(condition);

它工作正常,但仍然没有涵盖一个案例,比如我有一个名字为“alex”的文档,如果我搜索“le”,我也应该得到这个文档。

【问题讨论】:

这能回答你的问题吗***.com/questions/9824010/… 但是如何进行多个字段搜索,就像我想在某些字段(名字、姓氏、电子邮件)中搜索我的搜索查询“al”一样。 查看here 了解新的测试版部分文本搜索功能。 【参考方案1】:

你可以这样使用:

let searchText = "al";

let condition =  $or: [ firstname: new RegExp("^" + searchText, "i") ,  lastname: new RegExp("^" + searchText, "i") ] 

const result = await User.find(contition).skip(1).limit(1);

【讨论】:

它工作正常,但在一种情况下我没有得到结果——比如用户名是“alex”,如果我搜索“le”,我什么也得不到。

以上是关于如何在 mongoDB 或 mongoose 中进行部分搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mongodb 或 Mongoose 查询并使用 javascript 打印?

MongoDB:如何使用 Mongoose 添加或更新子文档?

MongoDB:异步函数未完成或如何正确关闭与 mongoose 的连接

如何在运行 Mongodb 的 Mongoose 中执行脚本?

如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?

如何使用 mongoose 在 MongoDB 中的数据库中上传文件?