首页 > 解决方案 > Springboot GET API 在根据 Id 组合多个集合后显示来自多个集合的响应

问题描述

我正在使用 mongoDB 开发 Springboot 应用程序。我正在创建一个 GET API,它从数据库返回数据。我的要求是我想在组合来自多个集合的数据后返回响应,而不实际更改数据库数据或架构。

例如:

主要收藏:

{
_id: 123, name: abc, value: 132,
subCollectionDetails: {
   subCollectionId : 1111-1111,
   subCollectionOtherValues: "Some data", 
  }
},
{
_id: 124, name: fff, value: 132,
subCollectionDetails: {
   subCollectionId : 1111-2222,
   subCollectionOtherValues: "Some data", 
  }
}.
{
_id: 125, name: abc, value: 132,
subCollectionDetails: {
   subCollectionId : 1111-3333,
   subCollectionOtherValues: "Some data", 
  }
}

子集合 ID:

{
_id: 1111-1111, 
subCollectionName : "sub1",
subCollectionPresent : True 
}
{
_id: 1111-2222, 
subCollectionName : "sub1",
subCollectionPresent : True 
}

最终 GET API 响应 Response :

{
_id: 123, name: abc, value: 132,
subCollectionDetails: {
   _id: 1111-1111, 
   subCollectionName : "sub1",
   subCollectionPresent : True 
   subCollectionOtherValues: "Some data", 
  }
},
{
_id: 124, name: fff, value: 132,
subCollectionDetails: {
   _id: 1111-2222, 
   subCollectionName : "sub1",
   subCollectionPresent : True 
   subCollectionOtherValues: "Some data", 
  }
}.
{
_id: 125, name: abc, value: 132,
subCollectionDetails: {
  }
}

标签: javamongodbspring-bootmongodb-queryaggregation-framework

解决方案


该查询应该返回你想要的:

db.main.aggregate([
  {
    $lookup: {
      from: "sub",
      localField: "subCollectionDetails.subCollectionId",
      foreignField: "_id",
      as: "sub_lookup"
    }
  },
  {
    $project: {
      _id: true,
      name: true,
      value: true,
      subCollectionDetails: {
        $mergeObjects: [
            "$subCollectionDetails",
            {$arrayElemAt: ["$sub_lookup",0]}
        ]
      }
    }
  },
  {
    $project: {
      "subCollectionDetails.subCollectionId": false
    }
  }
])

你可以在这里运行这个https://mongoplayground.net/p/k-vkqoaH8nd


推荐阅读