在 meteor 中使用 MongoDB 聚合时无法获得正确的结果
Cannot get correct result when using MongoDB aggregation in meteor
我在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
,我认为我的管道是错误的。请看里面的评论:
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
元素,并不断从数组结果中过滤掉它,直到达到所需的索引。
因此,虽然在早期版本中是可能的,但要实现这一点需要做很多工作。
相关文章:
- 包含插入的Meteor方法没有返回记录ID作为结果
- Meteor js-控制台显示'未定义'即使返回结果
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- MongoDB:$addToSet Meteor中的重复结果回调
- Meteor:在模板接受Mongo查询结果之前修改它的最佳实践
- Meteor SmartCollection给出不一致的结果
- 如何在Meteor中将多个数据库的结果显示为列表格式
- 在 meteor 中使用 MongoDB 聚合时无法获得正确的结果
- Meteor.js HTTP.get 获取 JSON 引号并解析结果似乎包含一个回调函数
- 在 Meteor 中,如何将查找查询的处理结果发布为游标
- 如何在从 Meteor.method 返回之前等待子进程结果
- 如何使Meteor方法在使用wrapAsync完成内部函数后返回结果
- 使用Meteor Search Source软件包获取结果的反应性问题
- Meteor findOne查询在一个模板助手中返回未定义的结果.在其他模板助手中,同样的查询也能很好地工作
- Meteor:能够登录用户从他们的搜索结果中删除文档
- 在方法中返回Meteor.http结果
- 在自动完成的下拉列表[Meteor]中分组结果
- 将dynamable与meteor结合使用,在实际应用中会得到不同的结果
- Meteor反应式搜索栏,在未聚焦时显示所有结果
- 如何在Meteor JS中连接(或联合)来自两个mongodb集合的find()结果