【问题标题】:How to use `$unwind` to iterate exact value如何使用 `$unwind` 来迭代精确值
【发布时间】:2020-11-06 21:17:36
【问题描述】:

我是 mongoose 和 mongodb 的新手。

在我的 addtocart 架构中,我添加了 $lookups 和投影以将产品添加到购物车中。

当前响应 product_purchase_quantity 它在添加到购物车集合的数组中,它是键和值。因此,在$lookups 中,我尝试添加{$unwind: '$product_purchase_quantity'},但在添加add_to_cart_products 对象后打印了两次。不知道错在哪里?

下面我提到了预期的结果。

AddToCart 架构:

  lookups: [
      {
        from: 'shop_db_products',
        let: {
          productId: '$add_to_cart_products.product',
          purchaseQuantity: '$add_to_cart_products.product_quantity',
          productItemId: '$add_to_cart_products.product_item',
        },
        pipeline: [
          {
            $match: { $expr: { $in: ['$_id', '$$productId'] } },
          },
          {
            $lookup: {
              from: 'shop_db_products',
              localField: 'product_id',
              foreignField: '_id',
              as: 'products',
            },
          },
          {
            $project: {
              _id: true,
              product: {
                _id: '$_id',
                product_name: '$product_name',
              },
              product_purchase_quantity: '$$purchaseQuantity',
              product_item: {
                $reduce: {
                  input: {
                    $filter: {
                      input: '$product_items',
                      cond: {
                        $in: ['$$this._id', '$$productItemId'],
                      },
                    },
                  },
                  initialValue: {},
                  in: {
                    _id: '$$this._id',
                    product_size: { $concat: [{ $toString: '$$this.product_size.value' }, '$$this.product_size.unit'] },
                    product_price: '$$this.product_price',
                    product_type: '$$this.product_type'
                  },
                },
              },
            },
          },
        ],
        localField: '',
        as: 'add_to_cart_products',
        model: 'ProductModel',
      },
    ],

AddToCart 收藏

[
{
    
      "add_to_cart_user": "5f0076b7bd530928fc0c0285",
      "add_to_cart_products": [
        {
          "product": "5f05a0270b4f3a5c41c70826",
          "product_item": "5f05a0270b4f3a5c41c70877",
          "product_quantity": 5
        },
         {
          "product": "5f05a0270b4f3a5c41c70827",
          "product_item": "5f05a0270b4f3a5c41c70666",
          "product_quantity": 3
        }
      ],
      "add_to_cart_product_total": 5,
      "add_to_cart_discount": 50,
      "add_to_tax": "5eae321d21924800122f978e",
      "add_to_cart_grand_total": 500
    }
]

目前的回应:

{
    "_id": "5fa2a09b3c6316482098f6ff",
    "add_to_cart_status_is_active": true,
    "add_to_cart_discount": 50,
    "add_to_cart_tax": 8,
    "add_to_cart_products": [
        {
            "product": {
                "_id": "5f05a0270b4f3a5c41c70826",
                "product_name": "Avery Apricot Sour"
            },
            "product_purchase_quantity": [
                5,
                3
            ],
            "product_item": {
                "_id": "5f05a0270b4f3a5c41c70877",
                "product_size": "22oz",
                "product_price": 13.99
            }
        },
        {
            "product": {
                "_id": "5f05a0270b4f3a5c41c70827",
                "product_name": "Avery Dugana"
            },
            "product_purchase_quantity": [
                5,
                3
            ],
            "product_item": {
                "_id": "5f05a0270b4f3a5c41c70666",
                "product_size": "22oz",
                "product_price": 8.99
            }
        }
    ]
}

预期响应:

{
    "_id": "5fa2a09b3c6316482098f6ff",
    "add_to_cart_status_is_active": true,
    "add_to_cart_discount": 50,
    "add_to_cart_tax": 8,
    "add_to_cart_products": [
        {
            "product": {
                 "_id": "5f05a0270b4f3a5c41c70826",
                "product_name": "Avery Apricot Sour"
            },
            "product_purchase_quantity": 5,
            "product_item": {
                "_id": "5f05a0270b4f3a5c41c70877",
                "product_size": "22oz",
                "product_price": 13.99
            }
        },
        {
            "product": {
                 "_id": "5f05a0270b4f3a5c41c70827",
                "product_name": "Avery Dugana"
            },
            "product_purchase_quantity": 3,
            "product_item": {
                "_id": "5f05a0270b4f3a5c41c70666",
                "product_size": "22oz",
                "product_price": 8.99
            }
        }
    ]
}

产品 (shop_db_products) 集合:

[
    {
        "_id": "5f05a0270b4f3a5c41c70826",
        "product_no": "PRO04087",
        "product_store_no": "1001",
        "product_dept_no": "Irish Whiskey",
        "product_name": "2Gingers",
        "product_overview": "No Overview",
        "product_items": [
            {
                "_id": "5f05a0270b4f3a5c41c70877",
                "product_item_number": "857566003019",
                "product_price": 20.99,
                "product_cost": 20.99,
                "product_size": "750ml",
                "product_type": "Bottle",
                "product_value": 0,
                "product_quantity": 0,
                "product_images": [
                    "pro04087-857566003019-1.png"
                ],
                "product_item_is_active": true
            }
        ]
    },
...
]

【问题讨论】:

  • 您能否提供您的shop_db_products 收藏数据?
  • @Tiya jose 在上面添加了产品集合

标签: mongodb mongoose aggregation-framework


【解决方案1】:

在执行 $lookup 之前,您必须 $unwind add_to_cart_products

db.addToCart.aggregate([
  {
    $unwind: "$add_to_cart_products"
  },
  {
    $lookup: {
      from: "shop_db_products",
      let: {
        productId: "$add_to_cart_products.product",
        purchaseQuantity: "$add_to_cart_products.product_quantity",
        productItemId: "$add_to_cart_products.product_item"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id",
                "$$productId"
              ]
            }
          }
        },
        {
          $project: {
            _id: true,
            product: {
              _id: "$_id",
              product_name: "$product_name",
              
            },
            product_purchase_quantity: "$$purchaseQuantity",
            product_item: {
              $reduce: {
                input: {
                  $filter: {
                    input: "$product_items",
                    cond: {
                      $eq: [
                        "$$this._id",
                        "$$productItemId"
                      ],
                      
                    },
                    
                  },
                  
                },
                initialValue: {},
                in: {
                  _id: "$$this._id",
                  product_size: "$$this.product_size",
                  product_price: "$$this.product_price",
                  product_type: "$$this.product_type"
                }
              }
            }
          }
        }
      ],
      as: "add_to_cart_products"
    }
  },
  {
    $unwind: "$add_to_cart_products"
  },
  {
    $group: {
      _id: "$_id",
      "add_to_cart_products": {
        $push: "$add_to_cart_products"
      }
    }
  }
])

MongoDB Playground

【讨论】:

    【解决方案2】:

    另一种方式 没有减速器,有 $unwind

    https://mongoplayground.net/p/3uWA5pVBv83

    db.addToCart.aggregate([
      {
        "$unwind": "$add_to_cart_products"
      },
      {
        "$lookup": {
          "from": "shop_db_products",
          "let": {
            "productId": "$add_to_cart_products.product",
            "purchaseQuantity": "$add_to_cart_products.product_quantity",
            "productItemId": "$add_to_cart_products.product_item"
          },
          "pipeline": [
            {
              "$match": {
                "$expr": {
                  "$eq": [
                    "$_id",
                    "$$productId"
                  ]
                }
              }
            },
            {
              "$unwind": "$product_items"
            },
            {
              "$match": {
                "$expr": {
                  "$eq": [
                    "$product_items._id",
                    "$$productItemId"
                  ]
                }
              }
            },
            {
              "$project": {
                "_id": true,
                "product": {
                  "_id": "$_id",
                  "product_name": "$product_name"
                },
                "product_purchase_quantity": "$$purchaseQuantity",
                "product_item": "$product_items"
              }
            }
          ],
          "as": "productResolved"
        }
      },
      {
        "$unwind": "$productResolved"
      },
      {
        "$group": {
          "_id": "$_id",
          "add_to_cart_products": {
            "$push": "$productResolved"
          }
        }
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多