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
.