$replaceOne
nhà điều hành đường ống tổng hợp đã được giới thiệu trong MongoDB 4.4.
Toán tử này thay thế phiên bản đầu tiên của một chuỗi tìm kiếm trong một chuỗi đầu vào bằng một chuỗi thay thế và trả về kết quả.
Nếu không tìm thấy chuỗi tìm kiếm thì $replaceOne
trả về chuỗi đầu vào.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là products
với tài liệu sau:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Hãy sử dụng $replaceOne
toán tử để thay thế phiên bản đầu tiên của chuỗi Left Handed
với một chuỗi khác:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Kết quả:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Lưu ý rằng thực tế có hai trường hợp của chuỗi tìm kiếm (Left Handed
) nhưng chỉ có trường hợp đầu tiên được thay thế.
Để thay thế tất cả các trường hợp, hãy sử dụng $replaceAll
nhà điều hành.
Phân biệt chữ hoa chữ thường
$replaceOne
toán tử phân biệt chữ hoa chữ thường.
Ví dụ:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Kết quả:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Trong trường hợp này, tôi đã thay đổi trường hợp của một ký tự trong chuỗi tìm kiếm của mình. Tôi đã thay đổi Handed
đến handed
. Điều này dẫn đến chuỗi tìm kiếm không được tìm thấy và vì vậy không có gì được thay thế. Do đó, chuỗi đầu vào đã được trả về.
Độ nhạy dấu phụ
$replaceOne
toán tử nhạy cảm với dấu phụ.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id": 2, "product": "Toupée Tape" }
Và bây giờ chúng ta hãy thử tìm kiếm và thay thế từ Toupée
, nhưng quên sử dụng dấu sắc:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Kết quả:
{ "_id" : 2, "product" : "Toupée Tape" }
Không thay đổi.
Tôi đã không bao gồm dấu phụ trong chuỗi tìm kiếm của mình và vì vậy không có dấu nào phù hợp.
Đây là một lần nữa, nhưng lần này tôi bao gồm dấu phụ:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Kết quả:
{ "_id" : 2, "product" : "Wig Tape" }
Lần này, chuỗi tìm kiếm đã được tìm thấy và thay thế.
Biểu thức rỗng
Nếu bất kỳ biểu thức nào được cung cấp cho $replaceOne
null
, kết quả là null
.
Dưới đây là một ví dụ về việc cung cấp null
trường toán tử thành $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Kết quả:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Trong trường hợp này, find
trường toán tử null
và kết quả là null
.
Các trường bị thiếu
Nếu input
hoặc find
các trường toán tử tham chiếu đến một trường không tồn tại, khi đó kết quả là null
.
Ví dụ:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Kết quả:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Giá trị không phải chuỗi
Tất cả các biểu thức được cung cấp cho $replaceOne
phải đánh giá thành một chuỗi hoặc null
. Cung cấp bất kỳ loại nào khác sẽ trả về lỗi.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Hãy thử tìm kiếm và thay thế trên price
lĩnh vực:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$replaceOne requires that 'input' be a string, found: 7.50", "code" : 51746, "codeName" : "Location51746" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Nó trả về một lỗi, như mong đợi.
Chuẩn hóa Unicode
$replaceOne
toán tử không thực hiện bất kỳ quá trình chuẩn hóa unicode nào.
Xem tài liệu MongoDB để biết thêm thông tin về điều này và một ví dụ.