MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách sử dụng câu lệnh SQL LIKE trong MongoDB

Đối với hướng dẫn này, chúng tôi sẽ sử dụng official dummy dataset , chứa nhiều tài liệu về nhà hàng từ khắp khu vực New York.

Đây là ví dụ về cấu trúc tài liệu cơ bản trong bộ sưu tập này, sử dụng .findOne() phương pháp:

> db.restaurants.findOne()
{
        "_id" : ObjectId("56c651e7d84ccfde319961af"),
        "address" : {
                "building" : "469",
                "coord" : [
                        -73.961704,
                        40.662942
                ],
                "street" : "Flatbush Avenue",
                "zipcode" : "11225"
        },
        "borough" : "Brooklyn",
        "cuisine" : "Hamburgers",
        "grades" : [
                {
                        "date" : ISODate("2014-12-30T00:00:00Z"),
                        "grade" : "A",
                        "score" : 8
                },
                {
                        "date" : ISODate("2014-07-01T00:00:00Z"),
                        "grade" : "B",
                        "score" : 23
                },
                {
                        "date" : ISODate("2013-04-30T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                },
                {
                        "date" : ISODate("2012-05-08T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                }
        ],
        "name" : "Wendy'S",
        "restaurant_id" : "30112340"
}

Sức mạnh của Tìm kiếm

Phần quan trọng nhất của câu đố khi tìm kiếm trong bộ sưu tập MongoDB là db.collection.find() đơn giản nhưng linh hoạt phương pháp.

Với .find() , bạn có thể dễ dàng truy vấn một bộ sưu tập tài liệu, bằng cách chuyển một vài tham số đơn giản và trả về một cursor . Một cursor chỉ đơn giản là một tập kết quả và có thể được lặp lại để thao tác hoặc sử dụng các tài liệu được trỏ tới bởi cursor .

Như một ví dụ đơn giản về .find() đang hoạt động, chúng tôi sẽ cố gắng tìm tất cả các nhà hàng trong bộ sưu tập của chúng tôi có máy chủ Hamburgers như cuisine của họ :

>db.restaurants.find( { cuisine: "Hamburgers" } )
{ "_id" : ObjectId("56c651e7d84ccfde319961af"), "address" : { "building" : "469", "coord" : [ -73.961704, 40.662942 ], "street" : "Flatbush Avenue", "zipcode" : "11225" }, "borough" : "Brooklyn", "cuisine" : "Hamburgers", "grades" : [ { "date" : ISODate("2014-12-30T00:00:00Z"), "grade" : "A", "score" : 8 }, { "date" : ISODate("2014-07-01T00:00:00Z"), "grade" : "B", "score" : 23 }, { "date" : ISODate("2013-04-30T00:00:00Z"), "grade" : "A", "score" : 12 }, { "date" : ISODate("2012-05-08T00:00:00Z"), "grade" : "A", "score" : 12 } ], "name" : "Wendy'S", "restaurant_id" : "30112340" }
...

Tập hợp kết quả khá lớn, vì vậy, phép đo tốt hơn cho các ví dụ thử nghiệm của chúng tôi sẽ là chuỗi .count() phương thức vào .find() để chỉ cần xem có bao nhiêu tài liệu phù hợp với truy vấn của chúng tôi:

> db.restaurants.find( { cuisine: "Hamburgers" } ).count()
433

Đó là rất nhiều bánh mì kẹp thịt!

Tìm kiếm các Điểm giống nhau của Từ Sử dụng Regex

Bây giờ chúng ta đang sử dụng .find() để truy vấn bộ sưu tập của mình, chúng tôi thực sự có thể sửa đổi cú pháp của mình một chút và bắt đầu tìm kiếm các kết quả phù hợp dựa trên một từ hoặc cụm từ có thể là một phần khớp trong một trường nhất định, tương tự như LIKE toán tử cho công cụ SQL.

Mẹo là sử dụng regular expressions (hoặc regex viết tắt), về cơ bản là một chuỗi văn bản xác định một mẫu tìm kiếm. Có một số regex các công cụ được viết theo cú pháp hơi khác nhau, nhưng các nguyên tắc cơ bản đều giống nhau và trong trường hợp này, MongoDB sử dụng Perl Regex (PCRE) động cơ.

Ở cấp độ cơ bản nhất, regex biểu thức là một chuỗi (chuỗi ký tự) được bao quanh cả hai bên bằng một dấu gạch chéo (/ ).

Ví dụ:nếu chúng ta muốn sử dụng regex để thực hiện cùng một truy vấn như trên và tìm xem có bao nhiêu nhà hàng phục vụ Hamburgers , chúng tôi có thể thay thế chuỗi "Hamburgers" của chúng tôi với /Hamburgers/ thay vào đó:

> db.restaurants.find( { cuisine: /Hamburgers/ } ).count()
433

Những người quan sát tinh ý có thể nhận ra rằng chúng tôi đã không thay đổi gì một cách hiệu quả đối với truy vấn thực tế mà chúng tôi đang thực hiện - chúng tôi vẫn chỉ đang tìm kiếm tất cả các tài liệu trong đó cuisine trường là bằng chuỗi "Hamburgers" .

Điều đó nói rằng, chỉ cần sử dụng regex thay vì "chuỗi được trích dẫn" thông thường, chúng tôi có thể bắt đầu tìm kiếm kết quả phù hợp từng phần từ / cụm từ thay vào đó.

Ví dụ:hãy nhìn vào borough để hiểu rõ hơn về cách hoạt động của nó. Đầu tiên, chúng tôi sẽ nhận thấy rằng tổng cộng có sáu quận trong bộ sưu tập của chúng tôi:

> db.restaurants.distinct('borough')
[
        "Brooklyn",
        "Bronx",
        "Manhattan",
        "Queens",
        "Staten Island",
        "Missing"
]

Bây giờ hãy sử dụng regex để tìm hiểu có bao nhiêu nhà hàng trong Bronx quận:

> db.restaurants.find( { borough: /Bronx/ } ).count()
2338

Nhưng hãy tưởng tượng chúng ta muốn tìm số lượng nhà hàng ở borough bắt đầu bằng ba ký tự đầu tiên "Bro" . Chúng tôi sẽ sửa đổi regex của mình rất nhẹ, như vậy:

> db.restaurants.find( { borough: /^Bro/ } ).count()
8424

Chúng tôi đang thấy hơn 6000 tài liệu bổ sung trong tập kết quả này, điều này rất có ý nghĩa bởi vì chúng tôi không chỉ nhận được kết quả ở nơi borough"Bronx" , mà còn là mọi thứ cho "Brooklyn" nữa.

Ký tự dấu mũ (^ ) chỉ định vị trí trong chuỗi của chúng tôi, vị trí phải là đầu , vì vậy nếu chúng tôi có một tài liệu mà ba chữ cái đó ở giữa trường, chúng tôi sẽ không khớp.

Như một ví dụ nhanh khác, hãy tìm kiếm mọi nơi trong trường cho các ký tự "at" , sẽ cung cấp cho chúng tôi kết quả cho cả "Manhattan""Staten Island" :

> db.restaurants.find( { borough: /Manhattan/ } ).count()
10259

> db.restaurants.find( { borough: /Staten Island/ } ).count()
969

> db.restaurants.find( { borough: /AT/i } ).count()
11228

Chắc chắn rồi, truy vấn cuối cùng của chúng tôi đã kết hợp hai tập hợp kết quả thành một.

Bạn có thể nhận thấy rằng mặc dù các ký tự "AT" của chúng tôi là chữ hoa trong regex của chúng tôi chuỗi, nhưng chúng là chữ thường trong hồ sơ tài liệu thực tế, chúng tôi vẫn trả kết quả. Điều này là do chúng tôi cũng đã thêm i đặc biệt gắn cờ sau dấu gạch chéo đóng regex của chúng tôi (/ ). Điều này thông báo cho regex công cụ mà chúng tôi muốn tìm kiếm case insensitive , khớp bất kể chữ hoa hay chữ thường.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. SocketException:Địa chỉ đã được sử dụng MONGODB

  2. Giao dịch Mongo DB 4.0 với Mongoose &NodeJs, Express

  3. MongoDB $ kéo

  4. Truy vấn các tài liệu có kích thước mảng lớn hơn 1

  5. Nhóm mảng sau khi thư giãn và khớp