在 Mongoose 的 find() 中使用 LIKE 模糊查询

SQL LIKE 运算符 允许您搜索带有通配符的字符串。 MongoDB 没有类似的运算符 – $text 运算符 执行更复杂的文本搜索。 但 MongoDB 确实支持与 LIKE 类似的正则表达式查询。

假设您要查找所有用户 email 包含 gmail,您可以简单地通过 JavaScript 正则表达式搜索 /gmail/

const User = mongoose.model(User, mongoose.Schema({
  email: String
}));

await User.create([
  { email: sergei@google.com },
  { email: bill@microsoft.com },
  { email: test@gmail.com },
  { email: gmail@google.com }
]);

const docs = await User.find({ email: /gmail/ });
docs.length; // 2
docs.map(doc => doc.email).sort(); // [gmail@google.com, test@gmail.com]

等效地,您可以使用 $regex 操作符。

const docs = await User.find({ email: { $regex: gmail } });

请注意,Mongoose 不会 您转义正则表达式中的特殊字符。 如果你想使用 $regexp 对于用户输入的数据,您应该首先使用 escape-string-regexp 或类似的库来处理字符串以转义正则表达式特殊字符。

const escapeStringRegexp = require(escape-string-regexp);
const User = mongoose.model(User, mongoose.Schema({
  email: String
}));

await User.create([
  { email: sergey@google.com },
  { email: bill@microsoft.com },
  { email: test+foo@gmail.com }
]);

const $regex = escapeStringRegexp(+foo);
const docs = await User.find({ email: { $regex } });

docs.length; // 1
docs[0].email; // test+foo@gmail.com

// Throws: MongoError: Regular expression is invalid: nothing to repeat
await User.find({ email: { $regex: +foo } });
© 版权声明
THE END
喜欢就支持一下吧
点赞756 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容