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

MongoDB $ substrCP

Trong MongoDB, $substrCP toán tử đường ống tổng hợp trả về chuỗi con của một chuỗi, dựa trên các chỉ mục điểm mã UTF-8 được chỉ định.

Cú pháp

Cú pháp như sau:

{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }

Ở đâu:

  • <string expression> là chuỗi. Nó có thể là bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một chuỗi.
  • <code point index> là nơi bắt đầu chuỗi con. Nó có thể là bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một số nguyên không âm.
  • <code point count> là bao nhiêu điểm mã mà chuỗi con sẽ tiếp tục. Nó có thể là bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một số nguyên không âm hoặc một số có thể được biểu diễn dưới dạng số nguyên.

Ví dụ

Hãy tưởng tượng chúng ta có một bộ sưu tập có tên là tests với tài liệu sau:

{ "_id" : 1, "data" : "Red Firetruck" }

Chúng tôi có thể sử dụng $substrCP như thế này:

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

Kết quả:

{ "data" : "Red Firetruck", "result" : "Red" }

Chỉ mục bắt đầu từ 0 và do đó, chuỗi con của chúng tôi bắt đầu ở đầu chuỗi và tiếp tục trong ba điểm mã.

Trong trường hợp này, chúng tôi đang sử dụng các ký tự tiếng Anh và mỗi ký tự có một điểm mã. Điều này giúp chúng tôi dễ dàng đếm số điểm mã sẽ sử dụng.

Hãy chạy một ví dụ khác:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result_1: { $substrCP: [ "$data", 4, 4 ] },
            result_2: { $substrCP: [ "$data", 8, 5 ] },
            result_3: { $substrCP: [ "$data", 8, 20 ] }
          }
     }
   ]
).pretty()

Kết quả:

{
	"data" : "Red Firetruck",
	"result_1" : "Fire",
	"result_2" : "truck",
	"result_3" : "truck"
}

Lưu ý trong kết quả thứ ba của chúng tôi, chúng tôi đã chỉ định nhiều điểm mã hơn số điểm có sẵn, nhưng nó chỉ trả về tất cả các ký tự về cuối chuỗi.

Dấu phụ

Một số ký tự được thêm dấu phụ, dẫn đến nhiều điểm mã.

Giả sử chúng ta có một bộ sưu tập có tên là thai trong đó có các tài liệu sau:

{ "_id" : 1, "data" : "ไม้เมือง" }
{ "_id" : 2, "data" : "ไ" }
{ "_id" : 3, "data" : "ม้" }
{ "_id" : 4, "data" : "เ" }
{ "_id" : 5, "data" : "มื" }
{ "_id" : 6, "data" : "อ" }
{ "_id" : 7, "data" : "ง" }

Các tài liệu này có các ký tự tiếng Thái. Chúng ta có thể thấy rằng hai trong số các ký tự này bao gồm một dấu phụ (một glyph nhỏ phía trên glyph ban đầu).

Các tài liệu từ 2 đến 7 chỉ cần liệt kê ra từng ký tự có trong tài liệu 1.

Trước khi chúng ta lấy một chuỗi con, hãy cùng tìm hiểu xem mỗi ký tự này có bao nhiêu điểm mã bằng cách sử dụng $strLenCP nhà điều hành:

db.thai.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$data" }
          }
     }
   ]
)

Kết quả:

{ "data" : "ไม้เมือง", "result" : 8 }
{ "data" : "ไ", "result" : 1 }
{ "data" : "ม้", "result" : 2 }
{ "data" : "เ", "result" : 1 }
{ "data" : "มื", "result" : 2 }
{ "data" : "อ", "result" : 1 }
{ "data" : "ง", "result" : 1 }

Chúng ta có thể thấy rằng hai ký tự có dấu phụ có hai điểm mã và những ký tự khác có một điểm mã.

Hãy áp dụng $substrCP đến tài liệu đầu tiên:

db.thai.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $substrCP: [ "$data", 1, 2 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : "ไม้เมือง", "result" : "ม้" }

Dựa trên điểm xuất phát của chúng tôi là 1 và số điểm mã của chúng tôi là 2 , chúng tôi nhận được ký tự thứ hai và dấu phụ liên quan của nó.

Tách các Glyphs

Trong ví dụ trước, đối số thứ ba của chúng ta là 2 để nó trả về ký tự và dấu cùng nhau. Đây là những gì sẽ xảy ra khi chúng tôi cung cấp đối số thứ ba là 1.

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

Kết quả:

{ "data" : "ไม้เมือง", "result" : "ม" }

Ký tự đầu tiên được trả về không có dấu phụ.

Các loại dữ liệu khác

$substrCP toán tử chỉ hoạt động trên chuỗi. Tuy nhiên, nếu bạn có một kiểu dữ liệu khác, kiểu dữ liệu này vẫn sẽ hoạt động, miễn là nó có thể phân giải thành một chuỗi.

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

{ "_id" : 2, "data" : 123456 }

Dữ liệu data trường chứa một số.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $substrCP vào trường đó:

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

Kết quả:

{ "data" : 123456, "result" : "23" }

Nó đã quản lý để thực hiện công việc tốt (mặc dù hãy nhớ rằng kết quả là một chuỗi - không phải một số).

Chúng tôi có một tài liệu khác có đối tượng Ngày:

{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }

Bây giờ hãy áp dụng $substrCP vào tài liệu đó:

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

Kết quả:

{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }

Vì vậy, nó cũng hoạt động tốt trong trường hợp này.

Giá trị rỗng

Nếu chuỗi null , kết quả là một chuỗi trống.

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

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

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

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

Kết quả:

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

Thiếu trường

Cố gắng lấy một chuỗi con từ một trường không tồn tại dẫn đến một chuỗi trống.

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

{ "_id" : 5 } 

Áp dụng $substrCP :

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

Kết quả:

{ "result" : "" }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách tìm tài liệu phù hợp với nhiều tiêu chí

  2. Tích hợp &Dịch vụ có sẵn từ MongoDB cho Đám mây

  3. Cách tạo tệp cấu hình cho MongoDB

  4. Bắt đầu với Python và MongoDB

  5. PostgreSQL so với MongoDB