首页 > 解决方案 > 如何使用 Mongo 聚合方法将一个集合字段名称加入另一个集合字段值?

问题描述

我在 Spring Boot 2 和 Spring Data MongoDB 上。

在前端,在用户表单中,所有字段都从数据库中动态显示。

我有所有字段的“归档”集合。

所以我的 Field 集合看起来像:

{
    "_id" : ObjectId("5f05a51dc9e77c00014bb3b5"),
    "fieldName" : "name",
    "fieldType" : "text"
},
{
    "_id" : ObjectId("5f05a51dc9e77c00014b4523"),
    "fieldName" : "address",
    "fieldType" : "text"
}

用户收藏

{
    "_id" : ObjectId("5f058db405c9fc60965ce243"),
    "name" : "john",
    "address" : "US"
}

现在我想根据 Field 集合和用户集合的 fileName 字段加入这两个集合。

我期望结果:

{
   "_id" : ObjectId("5f058db405c9fc60965ce243"),
   "fileds":[
   {
       "_id" : ObjectId("5f05a51dc9e77c00014bb3b5"),
       "fieldName" : "name",
       "fieldType" : "text",
       "value":"John"
   },
   {
       "_id" : ObjectId("5f05a51dc9e77c00014b4523"),
       "fieldName" : "address",
       "fieldType" : "text",
       "value":"US"
   }]
}

任何的想法?

标签: mongodbaggregation-framework

解决方案


这是一个快速示例,如何使用$objectToArray然后$lookup对字段名称执行此操作。

db.users.aggregate([
  {
    $addFields: {
      userFields: {
        $objectToArray: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$userFields"
  },
  {
    $lookup: {
      from: "fields",
      let: {
        field: "$userFields.k"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$field",
                "$fieldName"
              ]
            }
          }
        },
        {
          $addFields: {
            value: "$$field"
          }
        }
      ],
      as: "fields"
    }
  },
  {
    $unwind: "$fields"
  },
  {
    $group: {
      _id: "$_id",
      fields: {
        $push: "$fields"
      }
    }
  }
])

蒙戈游乐场


推荐阅读