【问题标题】:How to join collection by nested object field in MongoDb?如何通过 MongoDb 中的嵌套对象字段加入集合?
【发布时间】:2021-09-03 09:55:06
【问题描述】:
  1. 我有一个来自集合“用户”的示例项目:

{
    "_id" : ObjectId("612e8361942c250f4ca280f3"),
    "_cart" : [ 
        {
            "_id" : "60e38a2f2f6338e00e4ceff6",
            "count" : 2
        }, 
        {
            "_id" : "60e38a2f2f6338e00e4ceff7",
            "count" : 3
        }, 
        {
            "_id" : "60e38a2f2f6338e00e4ceff8",
            "count" : 4
        }
    ],
    "name" : "max1",
    "email" : "andrey.kupets1@i.ua"
}
  1. 我有这样的产品集合:

/* 1 */
{
    "_id" : ObjectId("60e38a2f2f6338e00e4ceff6"),
    "name" : "Куб-лабиринт Svoora Замок",
    "category" : "Настольные игры",
    "price" : 449.0
}

/* 2 */
{
    "_id" : ObjectId("60e38a2f2f6338e00e4ceff7"),
    "name" : "Настольная игра Hasbro Классическая Монополия обновленная (C1009_121)",
    "category" : "Настольные игры",
    "price" : 449.0
}

/* 3 */
{
    "_id" : ObjectId("60e38a2f2f6338e00e4ceff8"),
    "name" : "Настольный футбол Merchant Ambassador 2-в-1",
    "category" : "Настольные игры",
    "price" : 1899.0
}    
  1. 如何通过在_cart-field 中嵌套_id-field 将产品对象加入到用户集合中的_cart-field?

  2. 我尝试以这种方式加入:

db.getCollection('users').aggregate([
    {$lookup: {
        from: 'products',
        localField: '_cart',
        foreignField: '_id',
        as: '_productsInCart'
    }}
])
  1. 我期待下一个输出:

{
    "_id" : ObjectId("612e890a3bb5da0328c4ffe4"),
    "_cart" : [ 
        {
            "_id" : "60e38a2f2f6338e00e4ceff6",
            "count" : 2
        }, 
        {
            "_id" : "60e38a2f2f6338e00e4ceff7",
            "count" : 3
        }, 
        {
            "_id" : "60e38a2f2f6338e00e4ceff8",
            "count" : 4
        }
    ],
    "name" : "max1",
    "email" : "andrey.kupets1@i.ua",
    "_productsInCart" : [ 
        {
            "_id" : ObjectId("60e38a2f2f6338e00e4ceff6"),
            "name" : "Куб-лабиринт Svoora Замок",
            "category" : "Настольные игры",
            "count" : 2,    
            "price" : 449.0,
        }, 
        {
            "_id" : ObjectId("60e38a2f2f6338e00e4ceff7"),
            "name" : "Настольная игра Hasbro Классическая Монополия обновленная (C1009_121)",
            "category" : "Настольные игры",
            "count" : 3,
            "price" : 449.0,
        }, 
        {
            "_id" : ObjectId("60e38a2f2f6338e00e4ceff8"),
            "name" : "Настольный футбол Merchant Ambassador 2-в-1",
            "category" : "Настольные игры",
            "count" : 4,
            "price" : 1899.0,
        }
    ]
}
  1. 但实际上我在 _productsInCart 字段中有输出:

"_productsInCart" : [ ]

【问题讨论】:

    标签: mongodb join collections aggregate


    【解决方案1】:

    您需要使用以下聚合:请参考https://mongoplayground.net/p/FfWpFZKdxhV

    db.users.aggregate([
      {
        "$unwind": "$_cart"
      },
      {
        "$addFields": {
          "_cartObjId": {
            "$toObjectId": "$_cart._id"
          }
        }
      },
      {
        $lookup: {
          from: "products",
          localField: "_cartObjId",
          foreignField: "_id",
          as: "_productsInCart"
        }
      },
      {
        "$unwind": "$_productsInCart"
      },
      {
        "$group": {
          "_id": "$_id",
          "_cart": {
            "$push": "$_cart"
          },
          "_productsInCart": {
            "$push": "$_productsInCart"
          },
          
        }
      }
    ])
    

    【讨论】:

    • 超级!谢谢!
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2022-01-09
    • 2016-06-23
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多