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

MongoDB $ indexOfCP

Trong MongoDB, $indexOfCP 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ố điểm mã UTF của lần xuất hiện đầu tiên.

Chỉ số điểm mã UTF dựa trên 0 (tức là nó bắt đầu từ 0 ).

Cú pháp

Cú pháp như sau:

{ $indexOfCP: [ <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 $indexOfCP 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 $indexOfCP đối với các tài liệu đó:

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

Kết quả:

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

Trong hai tài liệu đầu tiên, chuỗi con được tìm thấy ở vị trí chỉ mục điểm mã UTF 2 . Đã cho $indexOfCP kết quả dựa trên 0 (chỉ mục bắt đầu từ 0 ) vị trí 2 đại diện cho điểm mã thứ ba.

Đây là một kết quả khác với những gì chúng tôi sẽ nhận được nếu chúng tôi sử dụng $indexOfBytes , vì ký hiệu bản quyền (© ) trong tài liệu thứ hai chiếm 2 byte. Nhưng nó chỉ sử dụng một điểm mã, giống như những gì ký tự c sử dụ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: { $indexOfCP: [ "$data", "เ" ] }
          }
     }
   ]
)

Kết quả:

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

Trong trường hợp này, chúng tôi đã tìm kiếm một ký tự có trong tài liệu thứ ba và chỉ mục điểm mã UTF-8 của nó trở lại dưới dạng 3 . Đã cho $indexOfCP kết quả dựa trên 0, điều này có nghĩa là đây là điểm mã thứ tư.

Điều này là do ký tự thứ hai có một dấu phụ, cũng là một điểm mã. Do đó, ký tự đầu tiên là một điểm mã và ký tự thứ hai là hai điểm mã (bao gồm cả dấu phụ), bằng ba. Điều này có nghĩa là ký tự của chúng ta bắt đầu ở vị trí thứ tư (là số điểm mã 3 , do số lượng chỉ mục bắt đầu từ 0 ).

Xem MongoDB $strLenCP ví dụ trả về số điểm mã cho mỗi ký tự trong chuỗi cụ thể này. Và xem MongoDB $strLenBytes để xem số byte trong cùng một chuỗi.

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 $indexOfCP với vị trí bắt đầu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$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 chuỗi hoặc lớn hơn vị trí kết thúc, $indexOfCP trả về -1 .

Nếu là số âm, $indexOfCP 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: { $indexOfCP: [ "$data", "XYZ", 0, 3 ] }
          }
     }
   ]
)

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í 3 , 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: { $indexOfCP: [ "$data", "XYZ", 0, 5 ] }
          }
     }
   ]
)

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, $indexOfCP trả về -1 .

Nếu là số âm, $indexOfCP 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, $indexOfCP 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 $indexOfCP :

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

Kết quả:

{ "result" : null }

Giá trị rỗng

Nếu đối số đầu tiên là null , $indexOfCP 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 $indexOfCP :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$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: { $indexOfCP: [ "$data", null ] }
          }
     }
   ]
)

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the second argument, found: null",
	"code" : 40094,
	"codeName" : "Location40094"
} : 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à loại dữ liệu sai (tức là nó không phân giải thành một chuỗi), hãy $indexOfCP 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 $indexOfCP vào tài liệu đó:

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

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the first argument, found: double",
	"code" : 40093,
	"codeName" : "Location40093"
} : 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õ, $indexOfCP requires a string as the first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $ lookup trên ObjectId's trong một mảng

  2. Nhập tệp CSV vào MongoDB với mongoimport

  3. Bắt đầu với MongoDB Go Driver

  4. Mongoose Chỉ mục duy nhất không hoạt động!

  5. Cách tìm kiếm trong mảng đối tượng trong mongodb