我正在尝试建立一个管道,可以检查产品库存以及自一开始以来的销售情况。我让它在 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
]
}
]
}
}
}
]
}
}
}
}
}
]
我刚刚发现了问题。由于订单数组已添加到 $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
]
}
]
}
}
}
]
}
}
}
}
}
]