Find with LIKE mongoose

Nội dung bài viết

Video học lập trình mỗi ngày

Toán tử LIKE trong SQL cho phép bạn tìm kiếm các chuỗi bằng ký tự đại diện cho trước. Nhưng ở MongoDB thì không hỗ trợ tính năng như trên một cách rõ ràng. Việc sử dụng $text operator là một chức năng cao hơn, cho nên không giống như LIKE trong SQL được. Vậy làm thế nào?


For example


Giả sử một tình huống bạn muốn tìm những email có chứa từ `gmail` trong một collection thì phải làm sao? Bạn có thể chỉ cần tìm kiếm bằng cụm từ thông dụng JavaScript như sau:


Đối với việc sử dụng LIKE trong SQL thì nó sẽ được viết như thế này:


SELECT * FROM User WHERE username LIKE 'gmail'


Nhưng đối với việc sử dụng Mongoose thì triển khai với hai phương thức thế này:



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']


Nếu nhưng ai đã quen với việc sử dụng $regex thì có thể làm tương tự như sau:


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

Cho cùng một kết quả. Nhưng hãy lưu ý rằng ở Mongoode không support những ký tự đặc biết khi sử dụng `regexps` chính vì vậy chúng ta muốn sử dụng $regexp thì nên sử dụng sanitize với thư viện escape-string-regexp hoặc một thư viện tương tự để sử dụng các ký tự đặc biệt của biểu thức chính quy.


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' } });


Trên đây là một thủ thuật rất hay và rất hữu ích khi gặp trường hợp như trên. Thanks! 


Ref: https://masteringjs.io/tutorials/mongoose/find-like

Có thể bạn đã bị missing