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

Cắt mảng lồng nhau trong MongoDB Aggregate với $slice

Để cắt (slice) mảng bên trong mảng object, dùng $map kết hợp $slice trong $addFields.

Dữ liệu mẫu: Mảng Details chứa object có mảng Subjects

> db.demo111.insertOne({ 
    "_id" : 101, "Name" : "Chris", 
    "Details" : [ 
        { "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" }, { "_id" : "10003", "SubjectName" : "MongoDB" } ] }, 
        { "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] } 
    ] 
});
{ "acknowledged" : true, "insertedId" : 101 }

Pipeline aggregate

> db.demo111.aggregate([
    { "$addFields": { 
        "Details": { 
            "$map": { 
                "input": "$Details", 
                "as": "out", 
                "in": { 
                    "_id": "$$out._id", 
                    "Score": "$$out.Score", 
                    "Subjects": { "$slice": [ "$$out.Subjects", 1 ] } 
                } 
            } 
        } 
    }}
]);

Kết quả

{ "_id" : 101, "Name" : "Chris", "Details" : [ { "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" } ] }, { "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] } ] }

Giải thích:

  • $map: Biến đổi từng phần tử của mảng Details
  • $$out: Phần tử hiện tại (object có _id, Score, Subjects)
  • $slice: ["$$out.Subjects", 1]: Lấy 1 phần tử đầu tiên của mảng Subjects
  • Dùng số dương: lấy từ đầu. Số âm: lấy từ cuối (ví dụ -1 = phần tử cuối)

Mở rộng: $slice cũng dùng trong projection find: {Subjects: {$slice: 2}} (lấy 2 phần tử đầu) hoặc {Subjects: {$slice: -2}} (lấy 2 phần tử cuối).