【问题标题】:Data merge without Object ID in mongoosemongoose中没有对象ID的数据合并
【发布时间】:2021-10-06 04:16:12
【问题描述】:

我正在使用猫鼬。

就像'Mysql Join',
我想在下面获取合并父母和孩子集合的数据。

家长

[
    {
        type: "A",
        results: [
            {
                "id": 111111
            },
            {
                "id": 222222
            }
        ]
    },
    {
        type: "B",
        results: [
            {
                "id": 333333
            },
            {
                "id": 444444
            }
        ]
    }
]

儿童

[
    {
        dataId: 111111,
        results: [
            { "status": { key: "value" } }
        ]
    },
    {
        dataId: 222222,
        results: [
            { "status": { key: "value" } }
        ]
    },
    {
        dataId: 333333,
        results: [
            { "status": { key: "value" } }
        ]
    },
    {
        dataId: 444444,
        results: [
            { "status": { key: "value" } }
        ]
    },
]

因为无法插入ObjectId,
好像不能用人口法处理。
我想合并两个数据,比如在 MySQL 中加入。
如下所示

父.find()

[
    {
        type: "A",
        results: [
            {
                "id": 111111,
                results: [
                    { "status": { key: "value" } }
                ]
            },
            {
                "id": 222222,
                results: [
                    { "status": { key: "value" } }
                ]
            }
        ]
    },
    {
        type: "B",
        results: [
            {
                "id": 333333,
                results: [
                    { "status": { key: "value" } }
                ]
            },
            {
                "id": 444444,
                results: [
                    { "status": { key: "value" } }
                ]
            }
        ]
    }
]

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    你可以使用这个查询:

    • $unwind 从数组中获取每个结果以与子 dataid 合并。
    • $lookup 是 mongodb 中的“加入”。这里的查询是将来自父级的id 与来自子级的dataId 合并到results
    • 再次$unwind,因为$lookup 创建了一个数组。
    • $group 根据 id 对值进行分组。
    • $project(此阶段是可选的)不显示您不想要的字段。
    yourParentModel.aggregate([
      {
        "$unwind": "$results"
      },
      {
        "$lookup": {
          "from": "Child",
          "localField": "results.id",
          "foreignField": "dataId",
          "as": "child_results"
        }
      },
      {
        "$unwind": "$child_results"
      },
      {
        "$group": {
          "_id": "$_id",
          "type": {
            "$first": "$type"
          },
          results: {
            "$push": "$child_results"
          }
        }
      },
      {
        "$project": {
          "_id": 0,
          "results._id": 0
        }
      }
    ])
    

    例如here

    【讨论】:

      【解决方案2】:

      你可以直接从 javascript 中做到这一点

      首先你从 mongoDB 获取父级 (使用猫鼬查找方法)

      let parents = [
        {
          type: "A",
          results: [
            {
              id: 111111,
            },
            {
              id: 222222,
            },
          ],
        },
        {
          type: "B",
          results: [
            {
              id: 333333,
            },
            {
              id: 444444,
            },
          ],
        },
      ];
      

      然后你从数据库中获取孩子

      let children = [
        {
          dataId: 111111,
          results: [{ status: { key: "value" } }],
        },
        {
          dataId: 222222,
          results: [{ status: { key: "value" } }],
        },
        {
          dataId: 333333,
          results: [{ status: { key: "value" } }],
        },
        {
          dataId: 444444,
          results: [{ status: { key: "value" } }],
        },
      ];
      

      父子合并的处理方式是这样的

      
      for (let parent of parents) {
        for (let objectId of parent.results) {
          for (let child of children) {
            if (child.dataId === objectId.id) {
              objectId.results = child.results;
              break;
            }
          }
        }
      }
      

      【讨论】:

      • 我知道这在 dbms 中比在服务器端代码中更有效。我想立即从 dbms 获取它,因为我有很多数据。
      • @sepw 嗯,我不是 mongodb 专家,但我想如果有一个 mongoose 方法可以做到这一点,那么服务器端代码的复杂性也会相同,如果你不这样做,还有一件事有丢失更多空间的问题,您可以更改 mongodb 中的父模型,以便每个父模型都包含整个子模型,而不仅仅是其 id,这样可以缩短查询执行时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多