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

MongoDB $ indexOfBytes

Trong MongoDB, $indexOfBytes toán tử đường ống tổng hợp tìm kiếm một chuỗi cho sự xuất hiện của một chuỗi con và trả về chỉ số byte UTF-8 của lần xuất hiện đầu tiên.

Chỉ mục byte UTF dựa trên 0 (tức là nó bắt đầu từ 0 ).

Cú pháp

Cú pháp như sau:

{ $indexOfBytes: [ <string expression>, <substring expression>, <start>, <end> ] }

Ở đâu:

  • <string expression> là chuỗi để tìm kiếm.
  • <substring expression> là chuỗi con bạn muốn tìm trong chuỗi.
  • <start> là một đối số tùy chọn chỉ định vị trí chỉ mục bắt đầu cho tìm kiếm. Có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số nguyên không âm.
  • <end> là một đối số tùy chọn chỉ định vị trí chỉ mục kết thúc cho tìm kiếm. Có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số nguyên không âm.

Nếu không tìm thấy giá trị đã chỉ định, hãy $indexOfBytes trả về -1 .

Nếu có nhiều trường hợp của giá trị được chỉ định, thì chỉ bản đầu tiên được trả về.

Ví dụ

Giả sử chúng ta có một bộ sưu tập được gọi là test với các tài liệu sau:

{ "_id" : 1, "data" : "c 2021" }
{ "_id" : 2, "data" : "© 2021" }
{ "_id" : 3, "data" : "ไม้เมือง" }

Dưới đây là ví dụ về việc áp dụng $indexOfBytes đối với các tài liệu đó:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "2021" ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "c 2021", "result" : 2 }
{ "data" : "© 2021", "result" : 3 }
{ "data" : "ไม้เมือง", "result" : -1 }

Chúng ta có thể thấy rằng hai tài liệu đầu tiên tạo ra các kết quả khác nhau, mặc dù chuỗi con dường như ở cùng một vị trí cho mỗi tài liệu. Trong tài liệu đầu tiên, chuỗi con được tìm thấy ở vị trí chỉ mục byte 2 , trong khi tài liệu thứ hai có nó tại 3 .

Lý do cho điều này là biểu tượng bản quyền (© ) trong tài liệu thứ hai chiếm 2 byte. c ký tự (trong tài liệu đầu tiên) chỉ sử dụng 1 byte. Ký tự khoảng trắng cũng sử dụng 1 byte.

Kết quả của $indexOfBytes dựa trên 0 (chỉ mục bắt đầu từ 0 ), và vì vậy chúng tôi kết thúc với kết quả là 23 tương ứng.

Về tài liệu thứ ba, hoàn toàn không tìm thấy chuỗi con và do đó kết quả là -1 .

Đây là một ví dụ khác, ngoại trừ lần này chúng tôi tìm kiếm một ký tự Thái Lan:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "เ" ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "c 2021", "result" : -1 }
{ "data" : "© 2021", "result" : -1 }
{ "data" : "ไม้เมือง", "result" : 9 }

Trong trường hợp này, chúng tôi đã tìm kiếm một ký tự xuất hiện ở vị trí thứ ba trong tài liệu thứ ba và chỉ mục byte UTF-8 của nó trở lại dưới dạng 9 .

Điều này là do trong trường hợp này, mỗi ký tự sử dụng 3 byte. Nhưng ký tự thứ hai có một dấu phụ, cũng là 3 byte. Do đó, hai ký tự đầu tiên (bao gồm cả dấu phụ) sử dụng 9 byte. Với lập chỉ mục dựa trên 0, chỉ mục byte UTF-8 của chúng nằm trong khoảng từ 0 thành 8 . Điều này có nghĩa là ký tự thứ ba bắt đầu ở vị trí 9 .

Xem MongoDB $strLenBytes ví dụ trả về số byte cho mỗi ký tự trong chuỗi cụ thể này.

Chỉ định vị trí bắt đầu

Bạn có thể cung cấp đối số thứ ba để chỉ định vị trí chỉ mục bắt đầu cho tìm kiếm.

Giả sử chúng ta có tài liệu sau:

{ "_id" : 4, "data" : "ABC XYZ ABC" }

Dưới đây là ví dụ về việc áp dụng $indexOfBytes với vị trí bắt đầu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "ABC", 1 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "ABC XYZ ABC", "result" : 8 }

Trong trường hợp này, phiên bản thứ hai của chuỗi con đã được trả về. Điều này là do chúng tôi đã bắt đầu tìm kiếm ở vị trí 1 và phiên bản đầu tiên của chuỗi con bắt đầu ở vị trí 0 (trước vị trí bắt đầu tìm kiếm).

Nếu vị trí bắt đầu là một số lớn hơn độ dài byte của chuỗi hoặc lớn hơn vị trí kết thúc, $indexOfBytes trả về -1 .

Nếu đó là số âm, $indexOfBytes trả về một lỗi.

Chỉ định vị trí kết thúc

Bạn cũng có thể cung cấp đối số thứ tư để chỉ định vị trí chỉ mục kết thúc cho tìm kiếm.

Nếu bạn cung cấp đối số này, bạn cũng cần cung cấp vị trí bắt đầu. Không làm như vậy sẽ dẫn đến đối số này được hiểu là điểm khởi đầu.

Ví dụ:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ", 0, 5 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "ABC XYZ ABC", "result" : -1 }

Kết quả là -1 có nghĩa là không tìm thấy chuỗi con. Đó là vì chúng tôi đã bắt đầu tìm kiếm ở vị trí 0 và kết thúc nó ở vị trí 5 , do đó không nắm bắt được chuỗi con.

Dưới đây là những gì sẽ xảy ra nếu chúng tôi tăng vị trí chỉ mục kết thúc:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ", 0, 7 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "ABC XYZ ABC", "result" : 4 }

Lần này giá trị đã được bao gồm và vị trí chỉ mục của nó được trả lại.

Nếu vị trí kết thúc là một số nhỏ hơn vị trí bắt đầu, $indexOfBytes trả về -1 .

Nếu đó là số âm, $indexOfBytes trả về một lỗi.

Các trường bị thiếu

Nếu trường không có trong tài liệu, $indexOfBytes trả về null .

Giả sử chúng ta có tài liệu sau:

{ "_id" : 5 }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfBytes :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Kết quả:

{ "result" : null }

Giá trị rỗng

Nếu đối số đầu tiên là null , $indexOfBytes trả về null .

Giả sử chúng ta có tài liệu sau:

{ "_id" : 6, "data" : null }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfBytes :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Kết quả:

{ "data" : null, "result" : null }

Tuy nhiên, khi đối số thứ hai (tức là chuỗi con) null , một lỗi được trả lại:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", null ] }
          }
     }
   ]
)

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfBytes requires a string as the second argument, found: null",
	"code" : 40092,
	"codeName" : "Location40092"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Loại dữ liệu sai

Nếu đối số đầu tiên là kiểu dữ liệu sai (tức là nó không phân giải thành một chuỗi), $indexOfBytes trả về một lỗi.

Giả sử chúng ta có tài liệu sau:

{ "_id" : 7, "data" : 123 }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfBytes vào tài liệu đó:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfBytes: [ "$data", "XYZ" ] }
          }
     }
   ]
)

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfBytes requires a string as the first argument, found: double",
	"code" : 40091,
	"codeName" : "Location40091"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Như thông báo lỗi nêu rõ, $indexOfBytes requires a string as the first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách thực hiện Tìm kiếm Toàn văn trong MongoDB

  2. Kết nối với MongoDB Atlas bằng Golang mgo:Liên tục không có máy chủ nào có thể truy cập được để đặt bản sao

  3. Lập bản đồ tài liệu với lược đồ được xác định một phần

  4. Golang mgo nhận các vật thể rỗng

  5. cách chuyển đổi chuỗi thành giá trị số trong mongodb