MongoDB: Có thể thực hiện một truy vấn không phân biệt chữ hoa chữ thường không?


304

Thí dụ:

> db.stuff.save({"foo":"bar"});

> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0

3
Kể từ MongoDB 3.2, bạn có thể thực hiện tìm kiếm không phân biệt chữ hoa chữ thường $caseSensitive: false. Xem: docs.mongodb.org/manual/reference/operator/query/text/iêu
martin

4
Lưu ý rằng đó là trên chỉ mục văn bản.
Willem D'Haeseleer 16/8/2016

1
@martin: $caseSensitiveđã sai theo mặc định và điều đó không trả lời câu hỏi, vì nó chỉ hoạt động trên các trường được lập chỉ mục. OP đang tìm kiếm so sánh chuỗi không phân biệt chữ hoa chữ thường.
Dan Dascalescu

Câu trả lời:


343

Bạn có thể sử dụng một regex .

Trong ví dụ của bạn đó sẽ là:

db.stuff.find( { foo: /^bar$/i } );

Tuy nhiên, tôi phải nói rằng, có lẽ bạn chỉ có thể viết hoa (hoặc viết hoa) giá trị trên đường đi thay vì phát sinh thêm chi phí mỗi khi bạn tìm thấy nó. Rõ ràng điều này sẽ không hoạt động cho tên của mọi người và như vậy, nhưng có thể các trường hợp sử dụng như thẻ.


27
Điều này hoạt động hoàn hảo. Làm cho nó hoạt động trong PHP với: $ sưu tập-> find (mảng ('key' => new MongoRegex ('/'.$ val.' / I ')));
Luke Dennis

2
Đặc biệt nếu bạn đang nội suy một chuỗi ({foo: / # {x} / i}) có thể có một dấu hỏi trong đó ..
Peter Ehrlich

17
Đừng quên ^ và $: MongoRegex ('/ ^'. Preg_quote ($ val). '$ / I')
Julien

20
Lưu ý rằng điều này sẽ làm một fullscan thay vì sử dụng chỉ mục.
Martin Konicek

12
Nó sẽ không làm một fullscan nếu anh ấy sử dụng ^ neo ngay từ đầu, do đó tầm quan trọng của lời khuyên của Julien.
Pax

198

CẬP NHẬT:

Câu trả lời ban đầu đã lỗi thời. Mongodb hiện hỗ trợ tìm kiếm toàn văn nâng cao, với nhiều tính năng.

TRẢ LỜI GỐC:

Cần lưu ý rằng tìm kiếm với trường hợp không nhạy cảm của regex / i có nghĩa là mongodb không thể tìm kiếm theo chỉ mục, vì vậy các truy vấn đối với các bộ dữ liệu lớn có thể mất nhiều thời gian.

Ngay cả với các bộ dữ liệu nhỏ, nó không hiệu quả lắm. Bạn có một cú đánh cpu lớn hơn nhiều so với các lệnh truy vấn của bạn, điều này có thể trở thành vấn đề nếu bạn đang cố gắng đạt được quy mô.

Thay vào đó, bạn có thể lưu trữ một bản sao chữ hoa và tìm kiếm dựa vào đó. Chẳng hạn, tôi có một bảng Người dùng có tên người dùng là trường hợp hỗn hợp, nhưng id là bản sao của tên người dùng. Điều này đảm bảo không thể sao chép phân biệt chữ hoa chữ thường (không có cả "Foo" và "foo") và tôi có thể tìm kiếm theo id = username.toUpperCase () để tìm kiếm tên người dùng không phân biệt chữ hoa chữ thường.

Nếu trường của bạn lớn, chẳng hạn như nội dung thư, sao chép dữ liệu có thể không phải là một lựa chọn tốt. Tôi tin rằng sử dụng một bộ chỉ mục không liên quan như Apache Lucene là lựa chọn tốt nhất trong trường hợp đó.


1
@Dan, chỉ để biết thông tin, trong MongoDB mới nhất, "Nếu chỉ mục tồn tại cho trường, thì MongoDB khớp với biểu thức chính quy so với các giá trị trong chỉ mục, có thể nhanh hơn quét bộ sưu tập." - docs.mongodb.org/manual/reference/operator/query/regex/iêu
Sergiy Sokolenko

1
Tài liệu đã được cập nhật có thể. Bây giờ họ nói "Đối với các truy vấn biểu thức chính quy phân biệt chữ hoa chữ thường, nếu chỉ mục tồn tại cho trường, thì MongoDB khớp với biểu thức chính quy với các giá trị trong chỉ mục, có thể nhanh hơn quét bộ sưu tập."
Jeff Lewis

1
Một hạn chế khác với chỉ mục văn bản là bạn chỉ có thể có một bộ sưu tập (nhiều cột), do đó không phù hợp nếu bạn cần cách ly tìm kiếm trên các trường khác nhau cho các trường hợp khác nhau.
Paul Grimshaw

2
@SergiySokolenko: các tài liệu hiện nói (đoạn cuối trong phần ): "Các truy vấn biểu thức chính quy không nhạy cảm thường không thể sử dụng các chỉ mục một cách hiệu quả. Việc triển khai $ regex không nhận biết đối chiếu và không thể sử dụng các chỉ mục không phân biệt chữ hoa chữ thường."
Dan Dascalescu

1
Sử dụng tìm kiếm toàn văn là sai trong trường hợp này (và có thể nguy hiểm ), bởi vì các câu hỏi về thực hiện một truy vấn case-insensitive, ví dụ như username: 'bill'khớp BILLhay Bill, không phải là một truy vấn tìm kiếm toàn văn, mà cũng sẽ trận đấu bắt nguồn từ các bill, chẳng hạn như Bills, billedv.v.
Dan Dascalescu

70

Nếu bạn cần tạo regrec từ một biến, đây là cách tốt hơn nhiều để làm điều đó: https://stackoverflow.com/a/10728069/309514

Sau đó, bạn có thể làm một cái gì đó như:

var string = "SomeStringToFind";
var regex = new RegExp(["^", string, "$"].join(""), "i");
// Creates a regex of: /^SomeStringToFind$/i
db.stuff.find( { foo: regex } );

Điều này có lợi ích là được lập trình nhiều hơn hoặc bạn có thể tăng hiệu suất bằng cách biên dịch nó trước thời hạn nếu bạn sử dụng lại nhiều.


1
new RegExp("^" + req.params.term.toLowerCase(), "i") cũng hoạt động tốt
Tahir Yasin

2
bạn nên xem xét việc thoát chuỗi để tăng tính bảo mật nếu biến xuất phát từ một yêu cầu: stackoverflow.com/a/50633536/5195127
davidivad

Bắt đầu với MongoDB 3.4, có hỗ trợ riêng cho các Chỉ số
phân biệt chữ hoa chữ thường

64

Hãy nhớ rằng ví dụ trước:

db.stuff.find( { foo: /bar/i } );

sẽ khiến mọi mục nhập chứa thanh khớp với truy vấn (bar1, barxyz, openbar), có thể rất nguy hiểm cho tìm kiếm tên người dùng trên chức năng xác thực ...

Bạn có thể cần làm cho nó chỉ khớp với cụm từ tìm kiếm bằng cách sử dụng cú pháp regrec thích hợp như:

db.stuff.find( { foo: /^bar$/i } );

Xem http://www.THER-expressions.info/ để biết trợ giúp cú pháp trên các biểu thức thông thường


Câu trả lời này trông giống như một bình luận.
Dan Dascalescu

62

Bắt đầu với MongoDB 3.4, cách được đề xuất để thực hiện các tìm kiếm không phân biệt chữ hoa chữ thường là sử dụng Chỉ số phân biệt chữ hoa chữ thường .

Cá nhân tôi đã gửi email cho một trong những người sáng lập để làm cho nó hoạt động, và anh ấy đã làm cho nó xảy ra! Đó là một vấn đề trên JIRA từ năm 2009 , và nhiều người đã yêu cầu tính năng này. Đây là cách nó hoạt động:

Một chỉ mục không phân biệt chữ hoa chữ thường được tạo bằng cách chỉ định đối chiếu với cường độ là 1 hoặc 2. Bạn có thể tạo một chỉ mục không phân biệt chữ hoa chữ thường như thế này:

db.cities.createIndex(
  { city: 1 },
  { 
    collation: {
      locale: 'en',
      strength: 2
    }
  }
);

Bạn cũng có thể chỉ định đối chiếu mặc định cho mỗi bộ sưu tập khi bạn tạo chúng:

db.createCollection('cities', { collation: { locale: 'en', strength: 2 } } );

Trong cả hai trường hợp, để sử dụng chỉ mục không phân biệt chữ hoa chữ thường, bạn cần chỉ định cùng một đối chiếu trong findthao tác được sử dụng khi tạo chỉ mục hoặc tập hợp:

db.cities.find(
  { city: 'new york' }
).collation(
  { locale: 'en', strength: 2 }
);

Điều này sẽ trả về "New York", "new york", "New york", v.v.

Ghi chú khác

  • Các câu trả lời gợi ý sử dụng tìm kiếm toàn văn là sai trong trường hợp này (và có khả năng nguy hiểm ). Câu hỏi là về việc thực hiện một truy vấn không phân biệt chữ hoa chữ thường, ví dụ: username: 'bill'khớp BILLhoặc Billkhông phải là truy vấn tìm kiếm toàn văn bản, cũng sẽ khớp với các từ có nguồn gốcbill , chẳng hạn như Bills, billedv.v.
  • Các câu trả lời gợi ý sử dụng biểu thức chính quy là chậm, bởi vì ngay cả với các chỉ mục, tài liệu nêu rõ :

    "Các truy vấn biểu thức chính quy không phân biệt chữ thường thường không thể sử dụng các chỉ mục một cách hiệu quả. Việc triển khai $ regex không nhận biết đối chiếu và không thể sử dụng các chỉ mục không phân biệt chữ hoa chữ thường."

    $regexcâu trả lời cũng có nguy cơ tiêm người dùng đầu vào .


Làm việc tuyệt vời cho tôi, ngay cả với đường ống tổng hợp.
Morio

Tôi nghĩ rằng đây là câu trả lời đúng, vì tốc độ đọc dữ liệu rất quan trọng
Rndmax

Tôi dường như không thể tìm thấy bất kỳ cách nào để thêm đối chiếu mặc định vào bộ sưu tập khi nó đã được tạo. Có cách nào để làm như vậy?
IncrediblePony

19
db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity

1
@ OlegV.Volkov phải có mô tả về cách câu trả lời của bạn phù hợp và những gì sai trong mã người hỏi.
Parth Trivei

1
Câu trả lời chỉ có mã này không thêm bất cứ điều gì vào câu trả lời được chấp nhận, đã được đăng 6 năm trước.
Dan Dascalescu

19

TL; DR

Cách chính xác để làm điều này trong mongo

Không sử dụng RegExp

Tự nhiên và sử dụng lập chỉ mục sẵn có của mongodb, tìm kiếm

Bước 1 :

db.articles.insert(
   [
     { _id: 1, subject: "coffee", author: "xyz", views: 50 },
     { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
     { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
     { _id: 4, subject: "baking", author: "xyz", views: 100 },
     { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
     { _id: 6, subject: "Сырники", author: "jkl", views: 80 },
     { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
     { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
   ]
)

Bước 2 :

Cần phải tạo chỉ mục trên bất cứ TEXT lĩnh vực bạn muốn tìm kiếm, mà không cần truy vấn lập chỉ mục sẽ rất chậm

db.articles.createIndex( { subject: "text" } )

bước 3 :

db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } )  //FOR SENSITIVITY
db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY

1
Tùy chọn tốt, nhưng không có gì "chính xác" hơn về việc sử dụng chỉ mục văn bản so với biểu thức chính quy, đó chỉ là một tùy chọn khác. Đó là quá mức cho trường hợp của OP.
JohnnyHK

2
Ngoại trừ regex chậm hơn đáng kể. Fulltext tìm kiếm cũng chậm, nhưng không chậm bằng. Cách nhanh nhất (nhưng nhiều hơn) sẽ là một trường riêng biệt luôn được đặt thành chữ thường.
Tom Mettam

4
Sử dụng tìm kiếm toàn văn là sai trong trường hợp này (và có thể nguy hiểm ), bởi vì các câu hỏi về thực hiện một truy vấn case-insensitive, ví dụ như username: 'bill'khớp BILLhay Bill, không phải là một truy vấn tìm kiếm toàn văn, mà cũng sẽ trận đấu bắt nguồn từ các bill, chẳng hạn như Bills, billedv.v.
Dan Dascalescu

15
db.company_profile.find({ "companyName" : { "$regex" : "Nilesh" , "$options" : "i"}});

2
Bạn đã xem các câu trả lời hiện có trước khi đăng bài này chưa? Thay vì một câu trả lời chỉ có mã trùng lặp, bạn có thể muốn giải thích cách nó thêm một cái gì đó có giá trị so với các câu trả lời trước đó.
Dan Dascalescu

1
Tôi chỉ muốn thêm rằng câu trả lời này là những gì đã đưa tôi đến một giải pháp. Tôi đang sử dụng một khung công tác PHP và điều này phù hợp với cú pháp ORM trong khi các giải pháp khác ở đây thì không. $existing = Users::masterFind('all', ['conditions' => ['traits.0.email' => ['$regex' => "^$value$", '$options' => 'i']]]);
Don Rzeszut

9

Mongo (phiên bản hiện tại 2.0.0) không cho phép tìm kiếm không phân biệt chữ hoa chữ thường đối với các trường được lập chỉ mục - xem tài liệu của họ . Đối với các trường không được lập chỉ mục, các biểu thức chính được liệt kê trong các câu trả lời khác sẽ ổn.


19
Chỉ cần làm rõ điều này: các tìm kiếm không phân biệt chữ hoa chữ thường được cho phép trên các trường được lập chỉ mục, chúng sẽ không sử dụng chỉ mục và sẽ chậm như thể trường không được lập chỉ mục.
heavyvi5ide

@ heavyvi5ide vì câu hỏi này đang được sử dụng để đánh dấu các bản sao Tôi nghĩ rằng tôi sẽ làm rõ rằng các biểu thức chính quy (cần thiết cho các tìm kiếm không phân biệt chữ hoa chữ thường) sử dụng chỉ mục, tuy nhiên, chúng phải thực hiện quét toàn bộ chỉ mục. Nói cách khác, họ không thể sử dụng chỉ số một cách hiệu quả . May mắn là tài liệu đã được cập nhật từ năm 2011 nhưng vẫn còn tốt để lưu ý ở đây.
Sammaye

7

Một điều rất quan trọng cần ghi nhớ khi sử dụng truy vấn dựa trên Regex - Khi bạn đang thực hiện việc này cho hệ thống đăng nhập, hãy thoát mọi ký tự bạn đang tìm kiếm và đừng quên các toán tử ^ và $. Lodash có một chức năng tốt cho việc này , nếu bạn đang sử dụng nó:

db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})

Tại sao? Hãy tưởng tượng một người dùng nhập .*làm tên người dùng của mình. Điều đó sẽ phù hợp với tất cả tên người dùng, cho phép đăng nhập bằng cách đoán bất kỳ mật khẩu của người dùng.


6

Phương thức tốt nhất là theo ngôn ngữ bạn chọn, khi tạo trình bao bọc mô hình cho các đối tượng của bạn, hãy để phương thức save () lặp lại thông qua một tập hợp các trường mà bạn sẽ tìm kiếm trên đó cũng được lập chỉ mục; những trường này nên có các bản sao chữ thường được sử dụng để tìm kiếm.

Mỗi khi đối tượng được lưu lại, các thuộc tính chữ thường sẽ được kiểm tra và cập nhật với bất kỳ thay đổi nào đối với các thuộc tính chính. Điều này sẽ làm cho nó để bạn có thể tìm kiếm hiệu quả, nhưng ẩn công việc bổ sung cần thiết để cập nhật các trường lc mỗi lần.

Các trường viết thường có thể là một khóa: đối tượng lưu trữ giá trị hoặc chỉ tên trường có tiền tố lc_. Tôi sử dụng cái thứ hai để đơn giản hóa truy vấn (truy vấn đối tượng sâu có thể gây nhầm lẫn đôi khi).

Lưu ý: bạn muốn lập chỉ mục các trường lc_, không phải các trường chính mà chúng dựa trên.


Giải pháp hay nhưng may mắn thay, bắt đầu với MongoDB 3.4, có hỗ trợ riêng cho Chỉ số phân biệt chữ hoa chữ thường .
Dan Dascalescu

6

Giả sử bạn muốn tìm kiếm "cột" trong "Bảng" và bạn muốn tìm kiếm không phân biệt chữ hoa chữ thường. Cách tốt nhất và hiệu quả là như dưới đây;

//create empty JSON Object
mycolumn = {};

//check if column has valid value
if(column) {
    mycolumn.column = {$regex: new RegExp(column), $options: "i"};
}
Table.find(mycolumn);

Mã ở trên chỉ thêm giá trị tìm kiếm của bạn dưới dạng RegEx và tìm kiếm với tiêu chí không nhạy cảm được đặt với tùy chọn "i".

Tất cả tốt nhất.


5

Sử dụng Mongoose điều này làm việc cho tôi:

var find = function(username, next){
    User.find({'username': {$regex: new RegExp('^' + username, 'i')}}, function(err, res){
        if(err) throw err;
        next(null, res);
    });
}

8
Không phải là .toLowerCase()dư thừa nếu bạn chỉ định cờ không phân biệt chữ hoa chữ thường i?
k00k

Vâng, đúng vậy. Bạn không cần .toLowerCase (). Tôi đã loại bỏ nó khỏi câu trả lời.
ChrisRich

hmm nên làm việc như vậy? Khi tôi tìm kiếm "mark", nó cũng nhận được mọi bản ghi với "marko" - có cách nào chỉ bỏ qua phân biệt chữ hoa chữ thường không?
Suisse

Ok tìm thấy nó, regex chính xác sẽ là: '^' + serach_name + '$', "i"
Suisse

3
Điều này nguy hiểm. Bạn không thoát tên người dùng, do đó, bất kỳ regex tùy ý có thể được tiêm.
Tom Mettam

3

Khung tổng hợp đã được giới thiệu trong mongodb 2.2. Bạn có thể sử dụng toán tử chuỗi "$ strcasecmp" để so sánh không phân biệt chữ hoa chữ thường giữa các chuỗi. Đó là khuyến cáo và dễ dàng hơn so với sử dụng regex.

Đây là tài liệu chính thức về toán tử lệnh tổng hợp: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#api._S_strcasecmp .


4
Làm thế nào để sử dụng điều này trong một truy vấn find ()? db. ware.find ({name: $ strcasecmp (name)})?
Suisse

3

Bạn có thể sử dụng Chỉ mục phân biệt chữ hoa chữ thường :

Ví dụ sau đây tạo ra một bộ sưu tập không có đối chiếu mặc định, sau đó thêm một chỉ mục trên trường tên với đối chiếu không phân biệt chữ hoa chữ thường. Các thành phần quốc tế cho Unicode

/* strength: CollationStrength.Secondary
* Secondary level of comparison. Collation performs comparisons up to secondary * differences, such as diacritics. That is, collation performs comparisons of 
* base characters (primary differences) and diacritics (secondary differences). * Differences between base characters takes precedence over secondary 
* differences.
*/
db.users.createIndex( { name: 1 }, collation: { locale: 'tr', strength: 2 } } )

Để sử dụng chỉ mục, các truy vấn phải chỉ định cùng đối chiếu.

db.users.insert( [ { name: "Oğuz" },
                            { name: "oğuz" },
                            { name: "OĞUZ" } ] )

// does not use index, finds one result
db.users.find( { name: "oğuz" } )

// uses the index, finds three results
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 2 } )

// does not use the index, finds three results (different strength)
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 1 } )

hoặc bạn có thể tạo một bộ sưu tập với đối chiếu mặc định:

db.createCollection("users", { collation: { locale: 'tr', strength: 2 } } )
db.users.createIndex( { name : 1 } ) // inherits the default collation

Có vẻ như vấn đề cú pháp nhỏ (thiếu Niềng răng). Vui lòng cập nhật truy vấn: db.users.createIndex( { name: 1 }, {collation: { locale: 'tr', strength: 2 } } )
Mohd Belal

3

Để tìm kiếm một biến và thoát nó:

const escapeStringRegexp = require('escape-string-regexp')
const name = 'foo'
db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})   

Thoát khỏi biến bảo vệ truy vấn chống lại các cuộc tấn công bằng '. *' Hoặc regex khác.

thoát-chuỗi-regrec


1

Sử dụng RegExp , trong trường hợp nếu bất kỳ tùy chọn nào khác không phù hợp với bạn, RegExp là một lựa chọn tốt. Nó làm cho trường hợp chuỗi không nhạy cảm.

var username = new RegExp("^" + "John" + "$", "i");;

sử dụng tên người dùng trong các truy vấn, và sau đó nó được thực hiện.

Tôi hy vọng nó sẽ làm việc cho bạn quá. Tất cả tốt nhất.


0

Tôi đã tạo một Func đơn giản cho trường hợp regex không nhạy cảm, mà tôi sử dụng trong bộ lọc của mình.

private Func<string, BsonRegularExpression> CaseInsensitiveCompare = (field) => 
            BsonRegularExpression.Create(new Regex(field, RegexOptions.IgnoreCase));

Sau đó, bạn chỉ cần lọc trên một lĩnh vực như sau.

db.stuff.find({"foo": CaseInsensitiveCompare("bar")}).count();

0

Sử dụng bộ lọc hoạt động với tôi trong C #.

string s = "searchTerm";
    var filter = Builders<Model>.Filter.Where(p => p.Title.ToLower().Contains(s.ToLower()));
                var listSorted = collection.Find(filter).ToList();
                var list = collection.Find(filter).ToList();

Nó thậm chí có thể sử dụng chỉ mục vì tôi tin rằng các phương thức được gọi sau khi hoàn trả xảy ra nhưng tôi chưa thử nghiệm điều này.

Điều này cũng tránh được vấn đề

var filter = Builders<Model>.Filter.Eq(p => p.Title.ToLower(), s.ToLower());

mongodb sẽ nghĩ p.Title.ToLower () là một tài sản và sẽ không ánh xạ đúng.


Cảm ơn, nó hoạt động cho tôi. Ở đây chúng ta cần có được bộ lọc trong biến sau đó chuyển qua phương thức Find ().
Nilay

0

Đối với bất kỳ ai sử dụng Golang và mong muốn có trường hợp tìm kiếm toàn văn nhạy cảm với mongodb và thư viện mgo godoc globalalsign .

collation := &mgo.Collation{
    Locale:   "en",
    Strength: 2, 
}


err := collection.Find(query).Collation(collation)

-1

Như bạn có thể thấy trong các tài liệu mongo - vì $textchỉ mục phiên bản 3.2 không phân biệt chữ hoa chữ thường: https://docs.mongodb.com/manual/core/index-text/#text-index-case-insensens

Tạo một chỉ mục văn bảnsử dụng toán tử $ text trong truy vấn của bạn .


Sử dụng tìm kiếm toàn văn là sai trong trường hợp này (và có thể nguy hiểm ), bởi vì các câu hỏi về thực hiện một truy vấn case-insensitive, ví dụ như username: 'bill'khớp BILLhay Bill, không phải là một truy vấn tìm kiếm toàn văn, mà cũng sẽ trận đấu bắt nguồn từ các bill, chẳng hạn như Bills, billedv.v.
Dan Dascalescu

-1

Chúng đã được thử nghiệm để tìm kiếm chuỗi

{'_id': /.*CM.*/}               ||find _id where _id contains   ->CM
{'_id': /^CM/}                  ||find _id where _id starts     ->CM
{'_id': /CM$/}                  ||find _id where _id ends       ->CM

{'_id': /.*UcM075237.*/i}       ||find _id where _id contains   ->UcM075237, ignore upper/lower case
{'_id': /^UcM075237/i}          ||find _id where _id starts     ->UcM075237, ignore upper/lower case
{'_id': /UcM075237$/i}          ||find _id where _id ends       ->UcM075237, ignore upper/lower case

-1

Tôi đã phải đối mặt với một vấn đề tương tự và đây là những gì làm việc cho tôi:

  const flavorExists = await Flavors.findOne({
    'flavor.name': { $regex: flavorName, $options: 'i' },
  });

Giải pháp này đã được đưa ra hai lần trước đó. Vui lòng kiểm tra câu trả lời hiện có trước khi đăng một cái mới.
Dan Dascalescu

@DanDascalescu không chắc chắn về những gì bạn đang nói, trên CTRL + F, giải pháp tương tự với nhiều upvote đã đăng nó vào tháng 9 năm 2018. Tôi đã đăng câu trả lời của mình vào tháng 4 năm 2018. Tôi thực sự đã đăng bài này vì không có gì vào thời điểm đó. Vui lòng kiểm tra khi nó được đăng trước khi cảnh báo những người thực sự cố gắng giúp đỡ.
Woppi

Tôi đang nói về câu trả lời này từ tháng 4 năm 2016 và câu trả lời này từ tháng 5 năm 2016. Cả hai đều sử dụng $regex$options. Bạn đã làm gì Ctrl + F?
Dan Dascalescu

Ngoài ra, việc sử dụng $regexlà không hiệu quả và có khả năng không an toàn, như tôi đã giải thích trong phần chỉnh sửa của mình cho câu trả lời năm 2016 khác này . Không có gì xấu hổ khi xóa câu trả lời nếu chúng không còn phục vụ cộng đồng!
Dan Dascalescu

Lưu ý về $ regex không hiệu quả, cảm ơn rất nhiều. Tôi Ctrl + F $ tùy chọn. Chúng tôi chỉ có hai ở đây không có Regapi mới trong mã $ regex của chúng tôi, tháng 4 năm 2018 và tháng 9 năm 2018. Tôi đã không sử dụng Regapi mới trong câu trả lời của mình. Tôi đã quên vấn đề cụ thể mà tôi gặp phải với Regapi mới được giải quyết khi tôi gỡ bỏ nó và chỉ sử dụng giải pháp này tôi đã đăng thay thế.
Woppi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.