【问题标题】:How to do join in mongodb with database references如何使用数据库引用加入 mongodb
【发布时间】:2020-11-22 20:49:36
【问题描述】:

我的 mongo 数据库有两个集合(从 MongoDB 查询结果中复制的样本):

Order: 
{
"_id" : ObjectId("5f242e68ceebdd59a456fee5"),
"date": ISODate("2020-07-30T22:00:00.000Z"),
"user" : {
        "$ref" : "user",
        "$id" : "user_0"
},
"item": "banana"
}

User:
{
    "_id" : "user_0",
    "login" : "login_0",
    "password" : "$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG",
    "first_name" : "John",
    "last_name" : "Kennedy",
    "email" : "jfk@gmail.com",
    "activated" : true
}

每个订单都属于一个用户。我在每个 Order 的对象中放入了相应用户的集合引用。

使用 MongoDB 的聚合功能,您将如何获取属于用户的 Order 数量并将其与他的名字和姓氏一起放入对象中?我希望结果看起来像这样:

TopUser 
{
    "firstName": "John",
    "lastName": "Kennedy",
    "nbOfOrders": 3
}

非常感谢。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以这样试试,

    [
      {
        "$lookup": {
          "from": "orders",
          "localField": "_id",
          "foreignField": "user.id",
          "as": "users"
        }
      },
      {
        $project: {
            _id:0,
          first_name: 1,
          last_name: 1,
          nbOfOrders: {
            $size: "$users"
          }
        }
      }
    ]
    

    工作Mongo playground 注意:从$ref$id 中删除$

    【讨论】:

    • 非常感谢,不过我有一个问题。 “first_name”字段的值 1 的真正含义是什么?它记录在哪里?
    • 1 - 包含字段,0 - 排除字段。参考这个docs.mongodb.com/manual/reference/operator/aggregation/project
    • 我今天刚刚测试了它,但它对我不起作用,“$users”数组实际上什么都不包含,尽管它应该包含用户所做的所有订单(就像在 mongodb 游乐场)
    • 两个表的关系是userId,不是吗?我根据您提供数据的方式制作了聚合管道,并且我还发布了一个 Demo,如果您觉得可以添加更多详细信息,请编辑
    • 哈哈,好笑。您已经给出了您的示例数据,@varman 所做的对问题来说是正确的,您必须尝试自己给出的答案,我们无法预测您的数据库有什么,或者您应该发布所有相关信息
    猜你喜欢
    • 2018-01-19
    • 2018-11-29
    • 2020-10-14
    • 1970-01-01
    • 2022-12-28
    • 2020-07-19
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多