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

时间:2019-12-30 06:07:23

标签: mongodb mongoose mongoose-schema

我的用户模型架构为

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',那么我也应该获得此文档。

1 个答案:

答案 0 :(得分: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);