MongoDB thư giãn

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

  1. 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
  2. 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
  3. 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: <field path> }
    

    Để 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: <field path>,
          includeArrayIndex: <string>,
          preserveNullAndEmptyArrays: <boolean>
        }
    }
    

FieldTypeDescription đường dẫn stringField đường dẫn đến một trường mảng. Để 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. includeArrayIndex chuỗiTùy chọn. Tên của một trường mới để giữ chỉ mục mảng của phần tử. Tên không được bắt đầu bằng ký hiệu đô la $ . preserveNullAndEmptyArraysboolean

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" : [ ] }
0

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 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" : [ ] }
1

Cá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" : [ ] }
2

Hoạ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" : [ ] }
3

Thao 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" : [ ] }
4

Thao 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" : [ ] }
5

Thao tác $unwind sau sử dụng tùy chọn preserveNullAndEmptyArrays . sizes field is missing, null or an empty array.

{
  $unwind:
    {
      path: <field path>,
      includeArrayIndex: <string>,
      preserveNullAndEmptyArrays: <boolean>
    }
}
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: <field path>,
      includeArrayIndex: <string>,
      preserveNullAndEmptyArrays: <boolean>
    }
}
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

Thư giãn MongoDB là gì?

Định nghĩa. thư giãn $. 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 mỗi 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ử.

Làm cách nào để sử dụng $push trong MongoDB?

Nếu trường không có trong tài liệu cần cập nhật, $push sẽ thêm trường mảng có giá trị làm thành phần của nó . Nếu trường không phải là một mảng, hoạt động sẽ thất bại. Nếu giá trị là một mảng, $push sẽ thêm toàn bộ mảng dưới dạng một phần tử. Để thêm riêng từng phần tử của giá trị, hãy sử dụng công cụ sửa đổi $each với $push.

Toán tử nào có thể đảo ngược tác động của thao tác thư giãn kép?

Mở tài liệu này ra hai lần sẽ có 6 tài liệu. Bây giờ để kết hợp chúng lại, bạn có thể sử dụng toán tử $push .

Tập hợp MongoDB là gì?

Tập hợp trong MongoDB là gì? . Các giai đoạn tạo nên cái được gọi là đường ống dẫn. Các giai đoạn trong quy trình có thể lọc, sắp xếp, nhóm, định hình lại và sửa đổi các tài liệu đi qua quy trình. a way of processing a large number of documents in a collection by means of passing them through different stages. The stages make up what is known as a pipeline. The stages in a pipeline can filter, sort, group, reshape and modify documents that pass through the pipeline.