MongoDB 聚合在 mongoplayground 上有效,但在 MongoDB Compass 和 Nodejs mongoose 后端上失败

问题描述 投票:0回答:1

我正在尝试建立一个管道,可以检查产品库存以及自一开始以来的销售情况。我让它在 mongoplayground 中工作,它计算库存总数和销售总数,但它不会计算 MongoDB Compass 或 NodeJS mongoose 后端的销售总数。由于某种原因,这两个项目中的销售总额将显示为 0。最后一个 $project 中的管道下面还有一条评论,显示它如何在 MongoDB Compass 和我的后端中工作,但不是以正确的方式。这也是一个有效的 mongoplayground 链接https://mongoplayground.net/p/ffTChpb94K_。为什么它的工作方式与 mongoplayground 版本不同是我目前试图弄清楚的。另外,mongoplayground 上的 MongoDB 版本是 6.0.13,我的 MongoDB 实例上的 MongoDB 版本是 6.0.14。但我认为这不会造成问题。

  [
    {
    "$group": {
      _id: {
        "productItem": "$productItem._id"
      },
      stock: {
        $push: "$$ROOT"
      }
    }
  },
  {
    "$project": {
      _id: "$_id.productItem",
      stock: "$stock",
      orders: [
        {
          "_id": "63c5035aaeb7f60e8e71fb8b",
          "store": "63bbbb7b0cad70daae6b9ef6",
          "pickingdate": "2023-01-30T10:52:44.000Z",
          "deliverydate": "2023-01-31T10:52:44.000Z",
          "products": [
            {
              "_id": "63c50394aeb7f60e8e71fb9d",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 350
            },
            {
              "_id": "63c50394aeb7f60e8e71fb9e",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 200
            },
            {
              "_id": "63d240169e5affab8243b630",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 250
            }
          ]
        },
        {
          "_id": "63e3993485a6f921498d62be",
          "store": "63bbbb870cad70daae6b9efa",
          "pickingdate": "2023-02-08T12:43:25.265Z",
          "deliverydate": "2023-02-08T12:43:25.265Z",
          "products": [
            {
              "_id": "63e3993485a6f921498d62bb",
              "productItem": "63bbbb350cad70daae6b9ed8",
              "amount": 0
            },
            {
              "_id": "63e3993485a6f921498d62bc",
              "productItem": "63bbbb000cad70daae6b9ed0",
              "amount": 0
            }
          ]
        },
        {
          "_id": "63eb8606c11f03d7dd1ac6e8",
          "store": "63bbbb660cad70daae6b9eee",
          "pickingdate": "2023-02-11T13:00:31.000Z",
          "deliverydate": "2023-02-11T13:00:31.000Z",
          "products": []
        },
        {
          "_id": "63d781d1afb570e9084adedd",
          "store": "63bbbb7b0cad70daae6b9ef6",
          "pickingdate": "2023-01-29T08:37:07.000Z",
          "deliverydate": "2023-01-30T08:37:07.784Z",
          "products": [
            {
              "_id": "63d781d1afb570e9084adeda",
              "productItem": "63bbbb350cad70daae6b9ed8",
              "amount": 0
            },
            {
              "_id": "63d781d1afb570e9084adedb",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 0
            }
          ]
        },
        {
          "_id": "63da6e6a9b234012ba12f856",
          "store": "63bbbb7b0cad70daae6b9ef6",
          "pickingdate": "2023-02-01T13:51:20.077Z",
          "deliverydate": "2023-02-01T13:51:20.077Z",
          "products": []
        },
        {
          "_id": "6408c4765c28184294cdbe8c",
          "store": "6408786e5061404ca8aa706a",
          "pickingdate": "2023-03-09T00:00:00.000Z",
          "deliverydate": "2023-03-10T00:00:00.000Z",
          "products": [
            {
              "_id": "6408c4765c28184294cdbe86",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 65
            },
            {
              "_id": "6408c4765c28184294cdbe87",
              "productItem": "6408782f5061404ca8aa6fca",
              "amount": 352
            },
            {
              "_id": "6408c4765c28184294cdbe88",
              "productItem": "63db7504857b18c809dcc59a",
              "amount": 66
            }
          ]
        },
        {
          "_id": "6408c4775c28184294cdbedf",
          "store": "63bbbb870cad70daae6b9efa",
          "pickingdate": "2023-03-12T00:00:00.000Z",
          "deliverydate": "2023-03-12T00:00:00.000Z",
          "products": [
            {
              "_id": "6408c4775c28184294cdbedb",
              "productItem": "63bbbb350cad70daae6b9ed8",
              "amount": 7
            },
            {
              "_id": "6408c4775c28184294cdbedc",
              "productItem": "63bbbb000cad70daae6b9ed0",
              "amount": 543
            },
            {
              "_id": "6408c4775c28184294cdbedd",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 543
            }
          ]
        },
        {
          "_id": "6408c4755c28184294cdbe14",
          "store": "63bbbb610cad70daae6b9eea",
          "pickingdate": "2023-03-07T00:00:00.000Z",
          "deliverydate": "2023-03-11T00:00:00.000Z",
          "products": [
            {
              "_id": "6408c4755c28184294cdbe0f",
              "productItem": "63bbbb000cad70daae6b9ed0",
              "amount": 30
            },
            {
              "_id": "6408c4755c28184294cdbe10",
              "productItem": "63db75ba857b18c809dcc611",
              "amount": 150
            },
            {
              "_id": "6465f005c8ce319aec89eaf2",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 150
            }
          ]
        },
        {
          "_id": "6475f3aef10517949a564b90",
          "store": "641989dbd22513c63a2b3d9d",
          "pickingdate": "2023-05-30T13:00:44.928Z",
          "deliverydate": "2023-05-30T13:00:44.928Z",
          "products": []
        },
        {
          "_id": "646cac842791e02d418d5d4d",
          "store": "646cac5d2791e02d418d5c6c",
          "pickingdate": "2023-05-23T12:06:00.663Z",
          "deliverydate": "2023-05-23T12:06:00.663Z",
          "products": [
            {
              "_id": "646cac842791e02d418d5d40",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d41",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d42",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d43",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d44",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d45",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d46",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d47",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d48",
              "productItem": "63bbbb3b0cad70daae6b9edc",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d49",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d4a",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            },
            {
              "_id": "646cac842791e02d418d5d4b",
              "productItem": "63bbbad10cad70daae6b9ec8",
              "amount": 100
            }
          ]
        },
        {
          "_id": "6465f1232576ace89acb5610",
          "store": "63bbbb610cad70daae6b9eea",
          "pickingdate": "2023-03-07T10:33:59.000Z",
          "deliverydate": "2023-03-08T10:33:59.000Z",
          "products": [
            {
              "_id": "6465f1232576ace89acb560e",
              "productItem": "64198afed22513c63a2b4370",
              "amount": 55
            },
            {
              "_id": "6465f1342576ace89acb5681",
              "productItem": "63db75a6857b18c809dcc60c",
              "amount": 150
            }
          ]
        },
        {
          "_id": "6475f6736c29eba3e1a9a96f",
          "store": "641989e2d22513c63a2b3e83",
          "pickingdate": "2023-05-30T13:11:28.448Z",
          "deliverydate": "2023-05-30T13:11:28.448Z",
          "products": [
            {
              "_id": "6475f6736c29eba3e1a9a96d",
              "productItem": "64198afed22513c63a2b437f",
              "amount": 0
            }
          ]
        }
      ],
      total: {
        $reduce: {
          "input": "$stock",
          "initialValue": 0,
          "in": {
            "$add": [
              "$$value",
              "$$this.amount"
            ]
          }
        }
      }
    }
  },
  {
    "$project": {
      _id: "$_id",
      stock: "$stock",
      totalInStock: "$total",
      soldTotal: {
        $reduce: {
          input: "$orders",
          initialValue: 0,
          in: {
            $add: [
              "$$value",
              {
                $reduce: {
                  input: "$$this.products",
                  initialValue: 0,
                  in: {
                    $add: [
                      "$$value",
                      {
                        $cond: [
                          {
                            $eq: [
                              "$$this.productItem",
                              "$_id" //IF I CHANGE THIS TO A CERTAIN ID LIKE 64198afed22513c63a2b437f IT WILL WORK IN MONGODB COMPASS AND NODEJS BACKEND AS WELL, BUT THE ID NEEDS TO COME FROM EACH GROUP BY ITSELF
                            ]
                          },
                          "$$this.amount",
                          0
                        ]
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
]

这是我通过使用具有相同管道的 MongoDB Compass 得到的响应。

mongodb aggregation-framework
1个回答
0
投票

我刚刚发现了问题。由于订单数组已添加到 $project 之一中。它将这些对象的 _id 视为字符串。在最后一个 $project 中,我将 objectid 与字符串进行比较,这显然会失败并返回错误值。

为了解决这个问题,我只是将来自订单对象数组的 id 转换为 objectid。我的错误是没有指定 mongoplayground 中的 objectid 是什么。由于它们都是字符串,所以工作得很好。但在真实的数据库中,它会获取 id 作为 objectid。

固定管道:

[
  {
    $group: {
      _id: {
        productItem: "$productItem._id"
      },
      stock: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $project: {
      _id: "$_id.productItem",
      stock: "$stock",
      orders: [
        {
          _id: "63c5035aaeb7f60e8e71fb8b",
          store: "63bbbb7b0cad70daae6b9ef6",
          pickingdate: "2023-01-30T10:52:44.000Z",
          deliverydate: "2023-01-31T10:52:44.000Z",
          products: [
            {
              _id: "63c50394aeb7f60e8e71fb9d",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 350
            },
            {
              _id: "63c50394aeb7f60e8e71fb9e",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 200
            },
            {
              _id: "63d240169e5affab8243b630",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 250
            }
          ]
        },
        {
          _id: "63e3993485a6f921498d62be",
          store: "63bbbb870cad70daae6b9efa",
          pickingdate: "2023-02-08T12:43:25.265Z",
          deliverydate: "2023-02-08T12:43:25.265Z",
          products: [
            {
              _id: "63e3993485a6f921498d62bb",
              productItem: "63bbbb350cad70daae6b9ed8",
              amount: 0
            },
            {
              _id: "63e3993485a6f921498d62bc",
              productItem: "63bbbb000cad70daae6b9ed0",
              amount: 0
            }
          ]
        },
        {
          _id: "63eb8606c11f03d7dd1ac6e8",
          store: "63bbbb660cad70daae6b9eee",
          pickingdate: "2023-02-11T13:00:31.000Z",
          deliverydate: "2023-02-11T13:00:31.000Z",
          products: []
        },
        {
          _id: "63d781d1afb570e9084adedd",
          store: "63bbbb7b0cad70daae6b9ef6",
          pickingdate: "2023-01-29T08:37:07.000Z",
          deliverydate: "2023-01-30T08:37:07.784Z",
          products: [
            {
              _id: "63d781d1afb570e9084adeda",
              productItem: "63bbbb350cad70daae6b9ed8",
              amount: 0
            },
            {
              _id: "63d781d1afb570e9084adedb",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 0
            }
          ]
        },
        {
          _id: "63da6e6a9b234012ba12f856",
          store: "63bbbb7b0cad70daae6b9ef6",
          pickingdate: "2023-02-01T13:51:20.077Z",
          deliverydate: "2023-02-01T13:51:20.077Z",
          products: []
        },
        {
          _id: "6408c4765c28184294cdbe8c",
          store: "6408786e5061404ca8aa706a",
          pickingdate: "2023-03-09T00:00:00.000Z",
          deliverydate: "2023-03-10T00:00:00.000Z",
          products: [
            {
              _id: "6408c4765c28184294cdbe86",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 65
            },
            {
              _id: "6408c4765c28184294cdbe87",
              productItem: "6408782f5061404ca8aa6fca",
              amount: 352
            },
            {
              _id: "6408c4765c28184294cdbe88",
              productItem: "63db7504857b18c809dcc59a",
              amount: 66
            }
          ]
        },
        {
          _id: "6408c4775c28184294cdbedf",
          store: "63bbbb870cad70daae6b9efa",
          pickingdate: "2023-03-12T00:00:00.000Z",
          deliverydate: "2023-03-12T00:00:00.000Z",
          products: [
            {
              _id: "6408c4775c28184294cdbedb",
              productItem: "63bbbb350cad70daae6b9ed8",
              amount: 7
            },
            {
              _id: "6408c4775c28184294cdbedc",
              productItem: "63bbbb000cad70daae6b9ed0",
              amount: 543
            },
            {
              _id: "6408c4775c28184294cdbedd",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 543
            }
          ]
        },
        {
          _id: "6408c4755c28184294cdbe14",
          store: "63bbbb610cad70daae6b9eea",
          pickingdate: "2023-03-07T00:00:00.000Z",
          deliverydate: "2023-03-11T00:00:00.000Z",
          products: [
            {
              _id: "6408c4755c28184294cdbe0f",
              productItem: "63bbbb000cad70daae6b9ed0",
              amount: 30
            },
            {
              _id: "6408c4755c28184294cdbe10",
              productItem: "63db7504857b18c809dcc59a",
              amount: 150
            },
            {
              _id: "6465f005c8ce319aec89eaf2",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 150
            }
          ]
        },
        {
          _id: "6475f3aef10517949a564b90",
          store: "641989dbd22513c63a2b3d9d",
          pickingdate: "2023-05-30T13:00:44.928Z",
          deliverydate: "2023-05-30T13:00:44.928Z",
          products: []
        },
        {
          _id: "646cac842791e02d418d5d4d",
          store: "646cac5d2791e02d418d5c6c",
          pickingdate: "2023-05-23T12:06:00.663Z",
          deliverydate: "2023-05-23T12:06:00.663Z",
          products: [
            {
              _id: "646cac842791e02d418d5d40",
              productItem: "63db7504857b18c809dcc59a",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d41",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d42",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d43",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d44",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d45",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d46",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d47",
              productItem: "63db7504857b18c809dcc59a",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d48",
              productItem: "63bbbb3b0cad70daae6b9edc",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d49",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d4a",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            },
            {
              _id: "646cac842791e02d418d5d4b",
              productItem: "63bbbad10cad70daae6b9ec8",
              amount: 100
            }
          ]
        },
        {
          _id: "6465f1232576ace89acb5610",
          store: "63bbbb610cad70daae6b9eea",
          pickingdate: "2023-03-07T10:33:59.000Z",
          deliverydate: "2023-03-08T10:33:59.000Z",
          products: [
            {
              _id: "6465f1232576ace89acb560e",
              productItem: "64198afed22513c63a2b4370",
              amount: 55
            },
            {
              _id: "6465f1342576ace89acb5681",
              productItem: "63db75a6857b18c809dcc60c",
              amount: 150
            }
          ]
        },
        {
          _id: "6475f6736c29eba3e1a9a96f",
          store: "641989e2d22513c63a2b3e83",
          pickingdate: "2023-05-30T13:11:28.448Z",
          deliverydate: "2023-05-30T13:11:28.448Z",
          products: [
            {
              _id: "6475f6736c29eba3e1a9a96d",
              productItem: "64198afed22513c63a2b437f",
              amount: 0
            }
          ]
        }
      ],
      total: {
        $reduce: {
          input: "$stock",
          initialValue: 0,
          "in": {
            $add: [
              "$$value",
              "$$this.amount"
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      _id: "$_id",
      stock: "$stock",
      totalInStock: "$total",
      soldTotal: {
        $reduce: {
          input: "$orders",
          initialValue: 0,
          "in": {
            $add: [
              "$$value",
              {
                $reduce: {
                  input: "$$this.products",
                  initialValue: 0,
                  "in": {
                    $add: [
                      "$$value",
                      {
                        $cond: [
                          {
                            $eq: [
                              {
                                $toObjectId: "$$this.productItem"
                              },
                              "$_id"
                            ]
                          },
                          "$$this.amount",
                          0
                        ]
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.