Trong MongoDB, $in
toán tử đường ống tổng hợp trả về một boolean cho biết liệu một giá trị được chỉ định có trong mảng hay không.
$in
không nên nhầm lẫn toán tử đường ống tổng hợp với $in
toán tử truy vấn, chọn các tài liệu trong đó giá trị của một trường bằng bất kỳ giá trị nào trong mảng được chỉ định.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là products
với các tài liệu sau:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Chúng tôi có thể sử dụng $in
toán tử để tìm hiểu xem có hay không các kích thước sizes
trường chứa giá trị L
.
Ví dụ:
db.products.aggregate(
[
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Kết quả:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : true } { "_id" : 3, "hasLarge" : true }
Đối số thứ hai phải phân giải thành một mảng
Đối số thứ hai của $in
toán tử phải phân giải thành một mảng. Nếu không, lỗi sẽ được trả lại.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" }
Lưu ý rằng các kích thước sizes
trường không phải là một mảng - nó là một chuỗi.
Hãy áp dụng $in
vào tài liệu đó:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: string", "code" : 40081, "codeName" : "Location40081" } : 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
Trong trường hợp này, các sizes
trường chứa một chuỗi., và do đó một lỗi được trả về.
Trong ví dụ này, tôi cũng sử dụng $in
với $match
để lọc tài liệu chỉ để lọc những tài liệu mà tôi quan tâm. Lưu ý rằng điều này sử dụng $in
cú pháp toán tử truy vấn, chấp nhận một đối số duy nhất và không được nhầm lẫn với cú pháp hai đối số.
Giá trị rỗng
Điều tương tự sẽ xảy ra nếu đối số thứ hai là null
.
Hãy thêm tài liệu sau vào bộ sưu tập:
{ "_id" : 5, "prod" : "Jeans", "sizes" : null }
Đây là những gì sẽ xảy ra nếu chúng tôi cố gắng sử dụng $in
với tài liệu đó:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: null", "code" : 40081, "codeName" : "Location40081" } : 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
Cùng một lỗi.
Các trường bị thiếu
Nó cũng tương tự với các trường bị thiếu.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 6, "prod" : "Shorts" }
Và bây giờ chúng tôi cố gắng áp dụng $in
với kích thước sizes
lĩnh vực:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: missing", "code" : 40081, "codeName" : "Location40081" } : 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
Biểu thức chính quy
Không giống như $in
toán tử truy vấn, $in
nhà điều hành đường ống tổng hợp không hỗ trợ việc sử dụng các biểu thức chính quy.
Do đó, mã sau không dẫn đến kết quả khớp:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
hasLarge: { $in: [ /^X/, "$sizes" ] }
}
}
]
)
Kết quả:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : false } { "_id" : 3, "hasLarge" : false }
Kết quả cho tất cả các tài liệu là false
, mặc dù các sizes
trường trong cả ba tài liệu không chứa các phần tử mảng bắt đầu bằng chữ hoa X
.