Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tìm kiếm tài liệu MongoDB với mảng lồng nhau đã điền và định dạng lại kết quả

Hãy tạo một collection với các tài liệu mẫu:

> db.demo187.insertOne(
   {
      "_id" : "101",
      "Details" : [
         { "Subject" : "MongoDB" },
         { "Subject" : "MySQL" }
      ]
   }
);
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo187.insertOne(
   {
      "_id" : "102",
      "Details" : [
         { }
      ]
   }
);
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo187.insertOne(
   {
      "_id" : "103",
      "Details" : [
         { "Subject" : "MongoDB" },
         { "Subject" : "MySQL" }
      ]
   }
);
{ "acknowledged" : true, "insertedId" : "103" }

Hiển thị tất cả tài liệu từ collection bằng phương thức find():

> db.demo187.find();

Kết quả đầu ra:

{ "_id" : "101", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }
{ "_id" : "102", "Details" : [ { } ] }
{ "_id" : "103", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ]

Truy vấn sau tìm các tài liệu MongoDB có mảng lồng nhau đã điền (không rỗng):

> db.demo187.aggregate([
   {$unwind: '$Details'},
   {$project: {Subject: '$Details.Subject'}},
   {$match: {Subject: {$exists: true}}}
])

Kết quả đầu ra - chỉ giữ lại các tài liệu có trường Subject tồn tại:

{ "_id" : "101", "Subject" : "MongoDB" }
{ "_id" : "101", "Subject" : "MySQL" }
{ "_id" : "103", "Subject" : "MongoDB" }
{ "_id" : "103", "Subject" : "MySQL" }

Giải thích: Pipeline aggregation sử dụng $unwind để phân tách mảng Details, $project để trích xuất trường Subject, và $match với $exists: true để lọc bỏ các phần tử rỗng.