Toán tử giai đoạn $unwind của MongoDB được sử dụng để giải cấu trúc trường mảng từ tài liệu đầu vào để xuất tài liệu cho từng phần tử. Mọi tài liệu đầu ra là tài liệu đầu vào với giá trị của trường mảng được thay thế bằng phần tử
cú pháp
{ $unwind: }
Những điểm cần nhớ
- Nếu giá trị của một trường không phải là một mảng, db. thu thập. tổng hợp [] tạo ra lỗi
- Nếu đường dẫn đã chỉ định cho một trường không tồn tại trong tài liệu đầu vào, đường dẫn sẽ bỏ qua tài liệu đầu vào và không hiển thị đầu ra
- Nếu mảng trống trong tài liệu đầu vào, đường dẫn sẽ bỏ qua tài liệu đầu vào và không hiển thị đầu ra
Thử nghiệm lấy mẫu1
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
Ví dụ. thư giãn $
Giai đoạn tổng hợp $unwind sau đây được sử dụng để xuất tài liệu cho từng phần tử trong mảng kích thước
> db.test1.aggregate[ [ { $unwind : "$sizes" } ] ];
đầu ra
> db.test1.aggregate[ [ { $unwind : "$sizes" } ] ]; { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "medium" } { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "XL" } { "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "free" }
Ở đây từ kết quả cho thấy rằng, mỗi tài liệu giống hệt với tài liệu đầu vào ngoại trừ giá trị của trường kích thước chứa giá trị từ mảng kích thước ban đầu
MongoDB cung cấp nhiều toán tử trạng thái. Toán tử $unwind là một trong những toán tử đó. Toán tử $unwind được sử dụng để giải cấu trúc một trường mảng trong tài liệu và tạo các tài liệu đầu ra riêng biệt cho từng mục trong mảng
Sự khác biệt duy nhất giữa tài liệu đầu vào và đầu ra là giá trị của trường mảng trong tài liệu đầu ra được thay thế bằng một mục duy nhất từ mảng tài liệu đầu vào. Toán tử $unwind chia các tài liệu phức tạp thành các phần nhỏ hơn, giúp chúng dễ đọc và dễ hiểu hơn
cú pháp
Điểm quan trọng
- Nếu giá trị của tùy chọn đường dẫn trường không phải là một mảng, nó sẽ tạo ra lỗi
- Nếu đường dẫn trường không tồn tại trong tài liệu đầu vào, nó sẽ không hiển thị đầu ra
- Nếu mảng trống, nó sẽ không hiển thị đầu ra
Hãy để chúng tôi lấy một ví dụ để hiểu rõ hơn về khái niệm toán tử $unwind
ví dụ 1. Sử dụng toán tử $unwind trên mảng
Tạo bộ sưu tập nhân viên
Bây giờ, hiển thị các tài liệu từ bộ sưu tập nhân viên bằng phương thức find[]
đầu ra
{ "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "age" : 31, "phone_no" : 8654793212 "company" : "javatpoint", "skills" : [ "C", "C++", "PHP", "Java", ".Net" ] }
Như bạn có thể thấy trường "kỹ năng" là một mảng chứa 5 mục ["C", "C++", "PHP", "Java", ". Bọc lưới"]
Bây giờ, hãy sử dụng toán tử $unwind và xem đầu ra trông như thế nào
đầu ra
/* 1 */ { "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "phone_no" : 8654793212, "age" : 31, "skills" : "C" } /* 2 */ { "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "phone_no" : 8654793212, "age" : 31, "skills" : "C++" } /* 3 */ { "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "phone_no" : 8654793212, "age" : 31, "skills" : "PHP" } /* 4 */ { "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "phone_no" : 8654793212, "age" : 31, "skills" : "Java" } /* 5 */ { "_id" : ObjectId["456187864hfh5421h510"], "name" : "Mikky", "phone_no" : 8654793212, "age" : 31, "skills" : ".Net" }
Như bạn có thể thấy ở đầu ra, chúng ta có tất cả bốn mục của các mảng nhúng được tách biệt. Bạn có thể chia nhỏ hơn nữa bằng cách sử dụng mảng "công việc"
Giải cấu trúc một trường mảng từ tài liệu đầu vào để xuất tài liệu cho từng phần tử. Mỗi tài liệu đầu ra là tài liệu đầu vào với giá trị của trường mảng được thay thế bằng phần tử
Giai đoạn $unwind có một trong hai cú pháp.
Toán hạng là một đường dẫn trường
{ $unwind: }
Để chỉ định đường dẫn trường, hãy thêm ký hiệu đô la vào trước tên trường $ và đặt trong dấu ngoặc kép.
Toán hạng là một tài liệu
3. 2 新版功能
{ $unwind: { path: , includeArrayIndex: , preserveNullAndEmptyArrays: } }
Tùy chọn. Nếu true , nếu đường dẫn rỗng, bị thiếu hoặc trống . Nếu $unwind outputs the document. If false , $unwind không xuất tài liệu nếu path is null, missing, or an empty array.
Giá trị mặc định là false .
Hành vi cư xử
Đường dẫn trường không phải mảng
在 3. 2 版更改. Giai đoạn $unwind không còn lỗi trên các toán hạng không thuộc mảng. Nếu toán hạng không phân giải thành một mảng nhưng không bị thiếu, null hoặc một mảng trống, thì $unwind coi toán hạng là một mảng phần tử đơn lẻ.
Trước đây, nếu một giá trị trong trường được chỉ định bởi đường dẫn trường không phải là một mảng, sẽ tạo ra lỗi
Thiếu trường
Nếu bạn chỉ định đường dẫn cho một trường không tồn tại trong tài liệu nhập hoặc trường là một mảng trống, $unwind , .
3. 2 新版功能. Để xuất tài liệu trong đó trường mảng bị thiếu, null hoặc mảng trống, hãy sử dụng tùy chọn preserveNullAndEmptyArrays .
ví dụ
Thư giãn mảng
Xem xét khoảng không quảng cáo với tài liệu sau.
________số 8
Việc tổng hợp sau đây sử dụng giai đoạn $unwind để xuất tài liệu cho từng thành phần trong kích thước . array:
db.inventory.aggregate[ [ { $unwind : "$sizes" } ] ]
Hoạt động trả về kết quả sau
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
0Mỗi tài liệu giống hệt với tài liệu đầu vào ngoại trừ giá trị của trường kích thước hiện giữ giá trị từ sizes array.
参见
邮政编码数据集的聚合, 对用户爱好数据做聚合
includeArrayIndex và preserveNullAndEmptyArrays
3. 2 新版功能
Một bộ sưu tập khoảng không quảng cáo có các tài liệu sau.
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
1Các thao tác $unwind sau đây là tương đương và trả về một tài liệu cho từng phần tử trong size< . Nếu trường field. If the size không phân giải thành mảng nhưng không thiếu, null hoặc mảng trống, $ . treats the non-array operand as a single element array.
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
2Hoạt động trả về các tài liệu sau
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
3Thao tác $unwind sau sử dụng tùy chọn includeArrayIndex .
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
4Thao tác mở rộng mảng size và bao gồm chỉ mục mảng của chỉ mục mảng trong mới . Nếu trường field. If the size không phân giải thành một mảng nhưng không thiếu, null hoặc một mảng trống, thì . field is null.
{
"_id" : 1,
"shirt" : "Half Sleeve",
"sizes" : [
"medium",
"XL",
"free"
]
}
{ "_id" : 2, "shirt" : "Full Sleeve", "sizes" : [ ] }
5Thao tác $unwind sau sử dụng tùy chọn preserveNullAndEmptyArrays . sizes field is missing, null or an empty array.
{ $unwind: { path: , includeArrayIndex: , preserveNullAndEmptyArrays: } }0
Ngoài việc mở ra các tài liệu trong đó kích thước là một mảng các phần tử hoặc một trường không null, không phải mảng, thao tác . sizes field is missing, null or an empty array:
{ $unwind: { path: , includeArrayIndex: , preserveNullAndEmptyArrays: } }1
← $skip [tập hợp] $group [tập hợp] →
© MongoDB, Inc 2008-2017. MongoDB, Mongo và logo chiếc lá là các nhãn hiệu đã đăng ký của MongoDB, Inc