MongoDB嵌套查找,最后级别具有3个级别和2个外键

发布于 2025-02-12 07:30:09 字数 3951 浏览 0 评论 0原文

我有3个集合,即RecordSetecg导出区。第一级具有source的第二级外键。当我与其他主题检查时,第三级只有1个外键,其中第二级。

但是,在这种情况下,我有2个外国键,它们连接到第一和第二级。

在查询最后一个级别时,我想添加更多约束,但我认为它不起作用。您能帮我检查查询吗?任何评论都非常感谢。

下面是我的3个收藏夹,其中包含数据样本。

记录集

{ "_id" : "1", "name" : "recordSet1", "source" : [1, 2, 3] }
{ "_id" : "2", "name" : "recordSet2", "source" : [1, 4, 5] }

ecg

{ "_id" : "1", "name_ecg" : "test1", "channel" : [ "I", "II", "III" ] }
{ "_id" : "2", "name_ecg" : "test2", "channel" : [ "II", "III" ] }
{ "_id" : "3", "name_ecg" : "test3", "channel" : [ "MLI", "MLII", "V5" ] }
{ "_id" : "4", "name_ecg" : "test4", "channel" : [ "I" ] }
{ "_id" : "5", "name_ecg" : "test5", "channel" : [ "II" ] }

导出区

{ "_id" : "1", "name_exp_region" : "exp_reg1", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "2", "name_exp_region" : "exp_reg2", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "3", "name_exp_region" : "exp_reg3", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "4", "name_exp_region" : "exp_reg4", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "5", "name_exp_region" : "exp_reg5", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "6", "name_exp_region" : "exp_reg6", "record_set_id" : "1", "ecg_id" : "3" }
{ "_id" : "7", "name_exp_region" : "exp_reg7", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "8", "name_exp_region" : "exp_reg8", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "9", "name_exp_region" : "exp_reg9", "record_set_id" : "2", "ecg_id" : "1" }

这是我的查询:

db.recordSet.aggregate(
    [
        {
            '$match': {
                '_id': 1
            }
        }, {
            '$lookup': {
                'from': 'ecg', 
                'localField': 'source', 
                'foreignField': '_id', 
                'as': 'ecg'
            }
        }, {
            '$unwind': {
                'path': '$ecg', 
                'preserveNullAndEmptyArrays': True
            }
        }, {
            '$lookup': {
                'from': 'exportingRegion', 
                'localField': 'ecg._id', 
                'foreignField': 'ecg_id', 
                'as': 'ecg.exportingRegion'
            }
        }, {
            '$lookup': {
                'from': 'exportingRegion', 
                'localField': 'record_set_id', 
                'foreignField': '_id', 
                'as': 'record_set.exportingRegion'
            }
        }, {
            '$group': {
                '_id': '$_id', 
                'ecg': {
                    '$push': {
                        'ecg': '$ecg', 
                        'exporting_region': '$exportingRegion'
                    }
                }
            }
        }
    ]
)

期望

{
  "_id": "1",
  "ecg": [
    {
      "_id": "1",
      "name_ecg": "test1",
      "channel": [
        "I",
        "II",
        "III"
      ],
      "exportingRegion": [
        {
          "_id": "1",
          "name_exp_region": "exp_reg1"
        },
        {
          "_id": "2",
          "name_exp_region": "exp_reg2"
        }
      ]
    },
    {
      "_id": "2",
      "name_ecg": "test2",
      "channel": [
        "II",
        "III"
      ],
      "exportingRegion": [
        {
          "_id": "3",
          "name_exp_region": "exp_reg3"
        },
        {
          "_id": "4",
          "name_exp_region": "exp_reg4"
        },
        {
          "_id": "5",
          "name_exp_region": "exp_reg5"
        }
      ]
    },
    {
      "_id": "3",
      "name_ecg": "test3",
      "channel": [
        "MLI",
        "MLII",
        "V5"
      ],
      "exportingRegion": [
        {
          "_id": "6",
          "name_exp_region": "exp_reg6"
        }
      ]
    }
  ]
}

I have 3 collections namely recordSet, ecg, and exportingRegion. The 1st level has a foreign key with the 2nd level by source. As I checked with other topics, the 3rd level has only 1 foreign key with the 2nd level.

However, in this case, I have 2 foreign keys, which connect to the 1st and 2nd levels.

I would like to add more constraints when querying the last level, but I think it does not work. Can you help me check the query? any comment is highly appreciated.

Below here is my 3 collections with the data sample.

recordSet

{ "_id" : "1", "name" : "recordSet1", "source" : [1, 2, 3] }
{ "_id" : "2", "name" : "recordSet2", "source" : [1, 4, 5] }

ecg

{ "_id" : "1", "name_ecg" : "test1", "channel" : [ "I", "II", "III" ] }
{ "_id" : "2", "name_ecg" : "test2", "channel" : [ "II", "III" ] }
{ "_id" : "3", "name_ecg" : "test3", "channel" : [ "MLI", "MLII", "V5" ] }
{ "_id" : "4", "name_ecg" : "test4", "channel" : [ "I" ] }
{ "_id" : "5", "name_ecg" : "test5", "channel" : [ "II" ] }

exportingRegion

{ "_id" : "1", "name_exp_region" : "exp_reg1", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "2", "name_exp_region" : "exp_reg2", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "3", "name_exp_region" : "exp_reg3", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "4", "name_exp_region" : "exp_reg4", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "5", "name_exp_region" : "exp_reg5", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "6", "name_exp_region" : "exp_reg6", "record_set_id" : "1", "ecg_id" : "3" }
{ "_id" : "7", "name_exp_region" : "exp_reg7", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "8", "name_exp_region" : "exp_reg8", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "9", "name_exp_region" : "exp_reg9", "record_set_id" : "2", "ecg_id" : "1" }

Here is my query:

db.recordSet.aggregate(
    [
        {
            '$match': {
                '_id': 1
            }
        }, {
            '$lookup': {
                'from': 'ecg', 
                'localField': 'source', 
                'foreignField': '_id', 
                'as': 'ecg'
            }
        }, {
            '$unwind': {
                'path': '$ecg', 
                'preserveNullAndEmptyArrays': True
            }
        }, {
            '$lookup': {
                'from': 'exportingRegion', 
                'localField': 'ecg._id', 
                'foreignField': 'ecg_id', 
                'as': 'ecg.exportingRegion'
            }
        }, {
            '$lookup': {
                'from': 'exportingRegion', 
                'localField': 'record_set_id', 
                'foreignField': '_id', 
                'as': 'record_set.exportingRegion'
            }
        }, {
            '$group': {
                '_id': '$_id', 
                'ecg': {
                    '$push': {
                        'ecg': '$ecg', 
                        'exporting_region': '$exportingRegion'
                    }
                }
            }
        }
    ]
)

Expectation:

{
  "_id": "1",
  "ecg": [
    {
      "_id": "1",
      "name_ecg": "test1",
      "channel": [
        "I",
        "II",
        "III"
      ],
      "exportingRegion": [
        {
          "_id": "1",
          "name_exp_region": "exp_reg1"
        },
        {
          "_id": "2",
          "name_exp_region": "exp_reg2"
        }
      ]
    },
    {
      "_id": "2",
      "name_ecg": "test2",
      "channel": [
        "II",
        "III"
      ],
      "exportingRegion": [
        {
          "_id": "3",
          "name_exp_region": "exp_reg3"
        },
        {
          "_id": "4",
          "name_exp_region": "exp_reg4"
        },
        {
          "_id": "5",
          "name_exp_region": "exp_reg5"
        }
      ]
    },
    {
      "_id": "3",
      "name_ecg": "test3",
      "channel": [
        "MLI",
        "MLII",
        "V5"
      ],
      "exportingRegion": [
        {
          "_id": "6",
          "name_exp_region": "exp_reg6"
        }
      ]
    }
  ]
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疏忽 2025-02-19 07:30:09

一个选项是使用$查找管道来执行您的限制:

db.recordSet.aggregate([
  {$match: {_id: "1"}},
  {$lookup: {
      from: "ecg",
      localField: "source",
      foreignField: "_id",
      as: "ecg"
    }
  },
  {$unwind: {path: "$ecg", preserveNullAndEmptyArrays: true}},
  {$lookup: {
      from: "exportingRegion",
      let: {recordId: "$_id", ecgId: "$ecg._id"},
      pipeline: [
        {$match: {
            $expr: {
              $and: [
                {$eq: ["$ecg_id", "$ecgId"]},
                {$eq: ["$record_set_id", "$recordId"]}
              ]
            }
          }
        }
      ],
      as: "exportingRegion"
    }
  },
  {$group: {
      _id: "$_id",
      ecg: {$push: {ecg: "$ecg", exporting_region: "$exportingRegion"}}
    }
  }
])

请参阅游乐场示例

One option is using the $lookup pipeline to enforce your limitations:

db.recordSet.aggregate([
  {$match: {_id: "1"}},
  {$lookup: {
      from: "ecg",
      localField: "source",
      foreignField: "_id",
      as: "ecg"
    }
  },
  {$unwind: {path: "$ecg", preserveNullAndEmptyArrays: true}},
  {$lookup: {
      from: "exportingRegion",
      let: {recordId: "$_id", ecgId: "$ecg._id"},
      pipeline: [
        {$match: {
            $expr: {
              $and: [
                {$eq: ["$ecg_id", "$ecgId"]},
                {$eq: ["$record_set_id", "$recordId"]}
              ]
            }
          }
        }
      ],
      as: "exportingRegion"
    }
  },
  {$group: {
      _id: "$_id",
      ecg: {$push: {ecg: "$ecg", exporting_region: "$exportingRegion"}}
    }
  }
])

See how it works on the playground example

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文