具有3个级别的MongoDB嵌套查找

尤里

我需要从数据库中以JSON检索整个单个对象层次结构。实际上,关于实现此结果的任何其他解决方案的建议将被高度推荐。我决定使用MongoDB及其$ lookup支持。

因此,我有三个集合:

派对

{ "_id" : "2", "name" : "party2" }
{ "_id" : "5", "name" : "party5" }
{ "_id" : "4", "name" : "party4" }
{ "_id" : "1", "name" : "party1" }
{ "_id" : "3", "name" : "party3" }    

地址

{ "_id" : "a3", "street" : "Address3", "party_id" : "2" }
{ "_id" : "a6", "street" : "Address6", "party_id" : "5" }
{ "_id" : "a1", "street" : "Address1", "party_id" : "1" }
{ "_id" : "a5", "street" : "Address5", "party_id" : "5" }
{ "_id" : "a2", "street" : "Address2", "party_id" : "1" }
{ "_id" : "a4", "street" : "Address4", "party_id" : "3" }

addressComment

{ "_id" : "ac2", "address_id" : "a1", "comment" : "Comment2" }
{ "_id" : "ac1", "address_id" : "a1", "comment" : "Comment1" }
{ "_id" : "ac5", "address_id" : "a5", "comment" : "Comment6" }
{ "_id" : "ac4", "address_id" : "a3", "comment" : "Comment4" }
{ "_id" : "ac3", "address_id" : "a2", "comment" : "Comment3" }

我需要检索所有具有所有相应地址和地址注释的各方,作为记录的一部分。我的汇总:

db.party.aggregate([{
    $lookup: {
        from: "address",
        localField: "_id",
        foreignField: "party_id",
        as: "address"
    }
},
{
    $unwind: "$address"
},
{
    $lookup: {
        from: "addressComment",
        localField: "address._id",
        foreignField: "address_id",
        as: "address.addressComment"
    }
}])

结果很奇怪。某些记录还可以。但是缺少_id 4的Party(没有地址)。另外,结果集中有两个Party _id 1(但地址不同):

{
    "_id": "1",
    "name": "party1",
    "address": {
        "_id": "2",
        "street": "Address2",
        "party_id": "1",
        "addressComment": [{
            "_id": "3",
            "address_id": "2",
            "comment": "Comment3"
        }]
    }
}{
    "_id": "1",
    "name": "party1",
    "address": {
        "_id": "1",
        "street": "Address1",
        "party_id": "1",
        "addressComment": [{
            "_id": "1",
            "address_id": "1",
            "comment": "Comment1"
        },
        {
            "_id": "2",
            "address_id": "1",
            "comment": "Comment2"
        }]
    }
}{
    "_id": "3",
    "name": "party3",
    "address": {
        "_id": "4",
        "street": "Address4",
        "party_id": "3",
        "addressComment": []
    }
}{
    "_id": "5",
    "name": "party5",
    "address": {
        "_id": "5",
        "street": "Address5",
        "party_id": "5",
        "addressComment": [{
            "_id": "5",
            "address_id": "5",
            "comment": "Comment5"
        }]
    }
}{
    "_id": "2",
    "name": "party2",
    "address": {
        "_id": "3",
        "street": "Address3",
        "party_id": "2",
        "addressComment": [{
            "_id": "4",
            "address_id": "3",
            "comment": "Comment4"
        }]
    }
}

请帮我解决一下这个。我对MongoDB还是很陌生,但是我觉得它可以满足我的需求。

d

您“麻烦”的原因是第二个汇总阶段- { $unwind: "$address" }它删除带有的参与者的记录_id: 4(因为,如前所述,因为其地址数组为空),并为产生两个记录,_id: 1并且_id: 5(因为每个记录都有两个地址)。

  • 为了防止没有地址的一方被除名,您应该将stagepreserveNullAndEmptyArrays选项设置$unwindtrue

  • 为了防止各方为其不同的地址重复,您应该$group在管道中添加聚合阶段。另外,使用$project带有$filter运算符的stage可以在输出中排除空地址记录。

db.party.aggregate([{
  $lookup: {
    from: "address",
    localField: "_id",
    foreignField: "party_id",
    as: "address"
  }
}, {
  $unwind: {
    path: "$address",
    preserveNullAndEmptyArrays: true
  }
}, {
  $lookup: {
    from: "addressComment",
    localField: "address._id",
    foreignField: "address_id",
    as: "address.addressComment",
  }
}, {
  $group: {
    _id : "$_id",
    name: { $first: "$name" },
    address: { $push: "$address" }
  }
}, {
  $project: {
    _id: 1,
    name: 1,
    address: {
      $filter: { input: "$address", as: "a", cond: { $ifNull: ["$$a._id", false] } }
    } 
  }
}]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有3个级别的用户的PHP登录系统

来自分类Dev

在MongoDB中的2个级别的嵌套数组中查找

来自分类Dev

在MongoDB中的2个级别的嵌套数组中查找

来自分类Dev

使用 Realm 在查询中过滤具有两个嵌套级别的对象

来自分类Dev

对具有嵌套级别的对象数组进行分组

来自分类Dev

具有双嵌套级别的SQL查询

来自分类Dev

如何设计具有更高嵌套级别的表?

来自分类Dev

创建具有 3 个级别的列表,包含子列表值的每个组合

来自分类Dev

JSON字符串化跳过具有三个以上级别的跳过嵌套对象

来自分类Dev

dplyr:使用TRUE和FALSE将具有3个级别的因子列更改为3个逻辑列

来自分类Dev

编译具有O3优化级别的GSL

来自分类Dev

带有3个级别的jQuery tabs子菜单

来自分类Dev

2个级别的无聊嵌套

来自分类Dev

嵌套的ifelse语句,带有编程级别的嵌套级别

来自分类Dev

为什么我没有需要3个级别的大括号的初始化3个级别的阵列?

来自分类Dev

R中具有data.frame的多个级别的嵌套列表

来自分类Dev

使用python从具有不同级别的嵌套列表和字典的json中提取数据

来自分类Dev

计算具有未知嵌套级别的多维数组中的相同值

来自分类Dev

具有多个继承级别的IDisposable

来自分类Dev

创建具有多个级别的图形

来自分类Dev

创建一个具有 4 个级别的新变量

来自分类Dev

在React JS中渲染具有n个级别的目录结构数据

来自分类Dev

如何合并具有不同级别的两个(或多个)栅格?

来自分类Dev

在PROC GLM中具有两个以上级别的CLASS变量的CONTRAST

来自分类Dev

如何使用具有三个继承级别的节

来自分类Dev

混合两个具有不同优化级别的静态库是否可行?

来自分类Dev

在Mongodb中查找并聚合多个级别的子文档

来自分类Dev

具有3种多索引级别的Pandas数据透视表

来自分类Dev

具有许多嵌套级别的层次结构列表,水平布局:父级可以适应子级宽度

Related 相关文章

  1. 1

    具有3个级别的用户的PHP登录系统

  2. 2

    在MongoDB中的2个级别的嵌套数组中查找

  3. 3

    在MongoDB中的2个级别的嵌套数组中查找

  4. 4

    使用 Realm 在查询中过滤具有两个嵌套级别的对象

  5. 5

    对具有嵌套级别的对象数组进行分组

  6. 6

    具有双嵌套级别的SQL查询

  7. 7

    如何设计具有更高嵌套级别的表?

  8. 8

    创建具有 3 个级别的列表,包含子列表值的每个组合

  9. 9

    JSON字符串化跳过具有三个以上级别的跳过嵌套对象

  10. 10

    dplyr:使用TRUE和FALSE将具有3个级别的因子列更改为3个逻辑列

  11. 11

    编译具有O3优化级别的GSL

  12. 12

    带有3个级别的jQuery tabs子菜单

  13. 13

    2个级别的无聊嵌套

  14. 14

    嵌套的ifelse语句,带有编程级别的嵌套级别

  15. 15

    为什么我没有需要3个级别的大括号的初始化3个级别的阵列?

  16. 16

    R中具有data.frame的多个级别的嵌套列表

  17. 17

    使用python从具有不同级别的嵌套列表和字典的json中提取数据

  18. 18

    计算具有未知嵌套级别的多维数组中的相同值

  19. 19

    具有多个继承级别的IDisposable

  20. 20

    创建具有多个级别的图形

  21. 21

    创建一个具有 4 个级别的新变量

  22. 22

    在React JS中渲染具有n个级别的目录结构数据

  23. 23

    如何合并具有不同级别的两个(或多个)栅格?

  24. 24

    在PROC GLM中具有两个以上级别的CLASS变量的CONTRAST

  25. 25

    如何使用具有三个继承级别的节

  26. 26

    混合两个具有不同优化级别的静态库是否可行?

  27. 27

    在Mongodb中查找并聚合多个级别的子文档

  28. 28

    具有3种多索引级别的Pandas数据透视表

  29. 29

    具有许多嵌套级别的层次结构列表,水平布局:父级可以适应子级宽度

热门标签

归档