Trong MongoDB, $literal
toán tử đường ống tổng hợp trả về một giá trị mà không cần phân tích cú pháp.
Nó chấp nhận bất kỳ biểu thức hợp lệ nào và trả về biểu thức chưa được phân tích.
$literal
toán tử có thể hữu ích khi bạn có một giá trị mà MongoDB có thể vô tình hiểu là một biểu thức, nhưng bạn không muốn nó.
Ví dụ:nếu bạn có số tiền bao gồm ký hiệu đô la, MongoDB có thể vô tình hiểu đó là tên trường. Bạn có thể sử dụng $literal
để ngăn MongoDB thông dịch các biểu thức như vậy.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là test
với tài liệu sau:
{ "_id" : 1, "name" : "Homer" }
Dưới đây là một ví dụ về việc áp dụng $literal
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
interpreted: "$name",
literal: { $literal: "$name" }
}
}
]
)
Kết quả:
{ "interpreted" : "Homer", "literal" : "$name" }
Trong ví dụ này, chúng tôi trả về giá trị của name
bằng cách sử dụng $name
để tham khảo nó.
Chúng tôi cũng trả về giá trị chữ $name
, mà không cần MongoDB diễn giải nó có nghĩa là name
lĩnh vực:
Ví dụ 2
Giả sử bộ sưu tập của chúng tôi chứa tài liệu sau:
{ "_id" : 2, "a" : 10, "b" : 5 }
Đây là một ví dụ khác về việc sử dụng $literal
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
interpreted: { $multiply: [ "$a", "$b" ] },
literal: { $literal: { $multiply: [ "$a", "$b" ] } }
}
}
]
)
Kết quả:
{ "interpreted" : 50, "literal" : { "$multiply" : [ "$a", "$b" ] } }
Trong trường hợp này, trường đầu tiên được trả về chứa kết quả của $multiply
toán tử so với a
và b
các lĩnh vực.
Trường thứ hai chỉ xuất ra giá trị chữ mà chúng tôi đã cung cấp cho $literal
nhà điều hành.