MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongoose tham gia hai bộ sưu tập và chỉ nhận các trường cụ thể từ bộ sưu tập đã tham gia

Bạn có thể thử,

  • $lookup với students bộ sưu tập
  • $project để hiển thị các trường bắt buộc, $map để lặp lại vòng lặp của mảng top10 và bên trong sử dụng $reduce để lấy tên đầy đủ từ sinh viên và hợp nhất với đối tượng top10 bằng cách sử dụng $mergeObjects
db.exams.aggregate([
  {
    $lookup: {
      from: "students",
      localField: "top10.studentId",
      foreignField: "_id",
      as: "students"
    }
  },
  {
    $project: {
      test: 1,
      students: {
        $map: {
          input: "$top10",
          as: "top10",
          in: {
            $mergeObjects: [
              "$$top10",
              {
                fullname: {
                  $reduce: {
                    input: "$students",
                    initialValue: 0,
                    in: {
                      $cond: [
                        { $eq: ["$$this._id", "$$top10.studentId"] },
                        "$$this.fullname",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Sân chơi

Tùy chọn thứ hai bạn có thể sử dụng $unwind trước $lookup ,

  • $unwind deconstruct top10 mảng
  • $lookup với students bộ sưu tập
  • $addFields để chuyển mảng sinh viên thành đối tượng bằng cách sử dụng $arrayElemtAt
  • $group bởi _id và xây dựng mảng cho sinh viên và đẩy các trường bắt buộc
db.exams.aggregate([
  { $unwind: "$top10" },
  {
    $lookup: {
      from: "students",
      localField: "top10.studentId",
      foreignField: "_id",
      as: "students"
    }
  },
  { $addFields: { students: { $arrayElemAt: ["$students", 0] } } },
  {
    $group: {
      _id: "$_id",
      test: { $first: "$test" },
      students: {
        $push: {
          studentId: "$top10.studentId",
          score: "$top10.score",
          fullname: "$students.fullname"
        }
      }
    }
  }
])

Sân chơi




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB truy vấn nhiều bộ sưu tập cùng một lúc

  2. MongoDB / NoSQL:Giữ lịch sử thay đổi tài liệu

  3. Làm thế nào để thêm định nghĩa của macro trong cmake?

  4. Cập nhật phần tử trong mảng nếu tồn tại khác chèn phần tử mới vào mảng đó trong MongoDb

  5. Cách tìm bằng id trong golang và mongodb