gpt4 book ai didi

javascript - 在meteor中使用MongoDB聚合时无法得到正确的结果

转载 作者:行者123 更新时间:2023-12-03 07:26:04 25 4
gpt4 key购买 nike

我在meteor中使用MongoDB聚合。

数据库中的项目如下所示:

//项目1

{
products: {
aaa: 100,
bbb: 200
}
}

//项目2

{
products: {
aaa: 300,
bbb: 400
}
}

我的管道看起来像这样

 let pipeline = [{
$limit: 10
}, {
$group: {
_id: {
// …
},
total: {
$sum: "$products.aaa"
}
}
}];

而且它运行完美。但是当我将数据库结构更改为这样时

//项目1

{
products: [
{code: "aaa", num: 100},
{code: "bbb", num: 200}
]
}

//项目2

{
products: [
{code: "aaa", num: 300},
{code: "bbb", num: 400}
]
}

我得到的total结果始终为0,我认为我的管道是错误的。请看里面的评论:

 let pipeline = [{
$limit: 10
}, {
$group: {
_id: {
// …
},
total: {
$sum: "$products.0.num" // Neither this nor "$products[0].num" works
}
}
}];

那么如何才能正确书写呢?谢谢

最佳答案

使用 MongoDB 3.2(它不会是与 Meteor 捆绑的服务器,但没有注意到阻止您使用单独的服务器实例。实际上会推荐)您可以使用 $arrayElemAt$map :

let pipeline = [
{ "$limit": 10 },
{ "$group": {
"_id": {
// …
},
"total": {
"$sum": { "$arrayElemAt": [
{ "$map": {
"input": "$products",
"as": "product",
"in": "$$product.num"
}},
0
]}
}
}}
];

对于旧版本,请使用“两个”$group阶段和 $first处理后的运算符 $unwind 。这仅适用于“第一个”索引值:

let pipeline = [
{ "$limit": 10 },
{ "$unwind": "$products" },
{ "$group": {
"_id": "$_id", // The document _id
"otherField": { "$first": "$eachOtherFieldForGroupingId" },
"productNum": { "$first": "$products.num" }
}},
{ "$group": {
"_id": {
// …
},
"total": {
"$sum": "$productNum"
}
}}
];

因此,在后一种情况下,在您 $unwind 之后,您只想使用 $first 从数组中获取“第一个”索引,它也将是用于从原始文档中获取要用作分组键一部分的每个字段。 $unwind 之后的每个数组成员的所有元素都会被复制。

在前一种情况下,$map 只是提取每个数组成员的 "num" 值,然后 $arrayElemAt 只是检索想要的值索引位置。

自然,MongoDB 3.2 的新方法更好。如果您想要另一个数组索引,那么您需要重复从数组中获取 $first 元素,并不断从数组结果中过滤掉它,直到达到所需的索引。

因此,虽然在早期版本中这是可能的,但要实现这一目标需要做很多工作。

关于javascript - 在meteor中使用MongoDB聚合时无法得到正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com