Câu hỏi Làm thế nào để truy vấn MongoDB với "like"?


Tôi muốn truy vấn một cái gì đó như của SQL like truy vấn:

select * 
from users 
where name like '%m%'

Làm thế nào để làm tương tự trong MongoDB?
Tôi không thể tìm thấy toán tử cho like bên trong tài liệu.


1065
2017-07-22 03:19


gốc


xem tài liệu của Mongodb: Truy vấn nâng cao - Cụm từ thông dụng mongodb.org/display/DOCS/… - douyw
Câu hỏi của bạn có ít nhất 5 phiếu bầu cho -nhà điều hành nhãn. Tôi có thể yêu cầu bạn đề nghị giống như sql như một từ đồng nghĩa? - Kermit
Liên kết này có thể giúp bạn goo.gl/gdTYK8 - Singh


Các câu trả lời:


Đó sẽ là:

db.users.find({"name": /.*m.*/})

hoặc tương tự:

db.users.find({"name": /m/})

Bạn đang tìm kiếm một cái gì đó có chứa "m" một nơi nào đó (SQL '%'toán tử tương đương với Regexp'.*'), không phải cái gì đó có "m" neo vào đầu chuỗi.


1436
2017-07-22 03:57



đang tìm kiếm bằng regex đắt tiền? - Freewind
Trên thực tế, nó phụ thuộc. Nếu truy vấn không sử dụng chỉ mục, và phải thực hiện quét bảng, thì chắc chắn nó có thể tốn kém. Nếu bạn đang thực hiện truy vấn regex 'bắt đầu bằng', thì có thể sử dụng chỉ mục. Tốt nhất để chạy một giải thích () để xem những gì đang xảy ra. - Kyle Banker
Khi không neo vào đầu chuỗi, nó hơi đắt tiền. Nhưng sau đó một lần nữa, như vậy là một LIKE truy vấn trong SQL. - Emily
miễn là nó được neo vào đầu chuỗi thì được chứ? mát mẻ sau đó. điều đó có nghĩa là chúng ta cần thêm ^ - J. Chang
Tôi sẽ thêm regex i javascript db.users.find({ "name": { $regex: /m/i } }) - Doron Segal


db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

ra: paulo, patric

db.users.find({name: /^pa/}) //like 'pa%' 

ra: paulo, patric

db.users.find({name: /ro$/}) //like '%ro'

ra: pedro


240
2018-05-20 13:26



ví dụ tốt đẹp! Tôi đang tìm kiếm kết thúc kiểm tra với không gian và tìm thấy điều này :) / $ / - Phuong
làm thế nào để bạn tìm thấy tất cả các mục nhập cho tên? hoặc ký tự đại diện cho * trong SQL? Cái gì đó select name from users; chỉ liệt kê tất cả người dùng? - anon58192932
@ anon58192932 Để hiển thị tất cả các mục của trường "tên" chỉ trong một bảng có tên là "người dùng", bạn có thể sử dụng phương thức project () bằng cách thiết lập các giá trị của trường mà bạn muốn 1. Các trường không được đề cập trong dự án () sẽ không được tìm nạp ngoại trừ _id. _id trường được in theo mặc định mà bạn có thể chặn bằng cách đặt 0 giá trị cho _id bên trong phương thức project (). Cái gì đó như - db.collection.find (). Project ({name: 1, _id: 0}) .toArray (hàm (err, docs) {console.log (docs); gọi lại (tài liệu);}); Tham khảo này - docs.mongodb.com/manual/tutorial/… - gauravparmar


Trong

  • PyMongo sử dụng Python
  • Mongoose sử dụng Node.js 
  • Jongo, sử dụng Java
  • mgo, sử dụng Đi

bạn có thể làm:

db.users.find({'name': {'$regex': 'sometext'}})

190
2017-10-07 17:07



nó hoạt động tốt cho trường hợp tìm kiếm nhạy cảm, bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể làm cho nó hoạt động để thực hiện tìm kiếm phân biệt chữ hoa chữ thường? - Tahir Yasin
Điều gì sẽ là regex cho %sometext% - Tahir Yasin
@TahirYasin nếu bạn vẫn tự hỏi, tìm kiếm phân biệt chữ hoa chữ thường sẽ được thực hiện như sau: db.users.find({'name': {'$regex': 'sometext', '$options': 'i'}}) - sumowrestler
Tôi đã giải quyết trong golang bằng cách sử dụng mgo chỉ đơn giản là mã như thế này, selector: = bson.M {"technician": bson.M {"$ regex": tech}} - Sandun Priyanka
@SandunPriyanka thư viện mgo có kiểu regex tích hợp, bạn nên sử dụng bson.M{"technician", bson.RegEx{Pattern: tech}} thay vào đó (nhưng hãy chắc chắn rằng tech đã được khử trùng hoặc nếu không bạn đã có một lỗ hổng tiêm regex!) - kbolino


Trong PHP, bạn có thể sử dụng mã sau:

$collection->find(array('name'=> array('$regex' => 'm'));

74
2018-05-13 08:36



python + mongoengine: people = People.objects.raw_query ({'name': {'$ regex': 'm'}}) - panchicore
Nếu giá trị RegEx của bạn bắt nguồn từ đầu vào của người dùng (ví dụ: biểu mẫu bộ lọc) và bạn không muốn giá trị được lấy làm RegExp, bạn có thể áp dụng preg_quote () cho nó. - Philipp Rieber
Tôi chỉ nhận ra điều này, nhưng đây thực sự là câu trả lời sai, mặc dù nó hoạt động nó là phụ tối ưu, bạn nên sử dụng đối tượng regex BSON thực tế thông qua MongoRegex, $ regex có vấn đề tương thích với các lệnh nhất định như $ in - Sammaye
Cú pháp này rất hữu ích nếu giá trị được lưu trữ trong một biến, vì vậy truy vấn có thể được viết dưới dạng (trong Ruby): $collection.where(field => {"$regex" => value}) - Donny Kurnia
Nhưng tại sao bạn không thể sử dụng mảng chữ? - Alper


Bạn sẽ sử dụng regex cho điều đó trong mongo.

ví dụ: db.users.find({"name": /^m/})


42
2017-07-22 03:48



Tôi nghĩ rằng điều này chỉ hiển thị các tài liệu có giá trị tên bắt đầu bằng "m" - JackAce


Nếu sử dụng node.js,  nói rằng bạn có thể viết điều này:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

Cũng thế, bạn có thể viết điều này:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );

24
2018-03-09 06:11



Cú pháp tương tự trong Ruby: collection.where(field => Regexp.new(value)) - Donny Kurnia


Đã có nhiều câu trả lời rồi. Tôi đang đưa ra các loại yêu cầu và giải pháp khác nhau cho tìm kiếm chuỗi với regex.

Bạn có thể làm với regex có chứa từ i.e như thế nào. Bạn cũng có thể sử dụng $options => i cho tìm kiếm phân biệt chữ hoa chữ thường

Chứa đựng string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Không chứa string chỉ với regex

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Trường hợp không chính xác string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Bắt đầu với string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Kết thúc với string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Giữ điều này làm dấu trang và tham chiếu cho bất kỳ thay đổi nào khác mà bạn có thể cần.


22
2017-08-11 15:39





Bạn đã nhận được câu trả lời nhưng để phù hợp với regex với trường hợp không nhạy cảm

Bạn có thể sử dụng truy vấn sau

db.users.find ({ "name" : /m/i } ).pretty()

Các i bên trong /m/i cho biết trường hợp không nhạy cảm và .pretty() cung cấp đầu ra đẹp hơn


14
2017-11-21 05:39





Bạn có 2 lựa chọn:

db.users.find({"name": /string/})

hoặc là

db.users.find({"name": {"$regex": "string", "$options": "i"}})

Thứ hai, bạn có nhiều tùy chọn hơn, như "i" trong các tùy chọn để tìm cách sử dụng phân biệt chữ hoa chữ thường. Và về "chuỗi", bạn có thể sử dụng như ".chuỗi.Ví dụ: "(% string%) hoặc" string. * "(chuỗi%) và". * string) (% string). Bạn có thể sử dụng cụm từ thông dụng như bạn muốn.

Thưởng thức!


13
2018-04-26 02:48