gpt4 book ai didi

javascript - 这个 mongoskin 聚合命令有什么问题?

转载 作者:可可西里 更新时间:2023-11-01 09:19:23 26 4
gpt4 key购买 nike

我有一个mongodb/mongoskin聚合请求如下:

db.collection(customerTable + '_earnedinfluencers').aggregate([
{
$group: {
_id: '$user',
name: '', // to be filled separately
username: '', // to be filled separately
picture: '', // to be filled separately
city: '', // to be filled separately
kids: { $sum: '$kids' },
revenue: { $sum: '$dayIncome' },
kidsRevRatio: { $divide: [ { $sum: '$kids' }, { $sum: '$dayIncome' } ] }
},

$match: {
richness: { $gte: variable1 },
kids: { $lt: variable2 },
hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
event: { $in: schoolfestival },
event: { $ne: 0 }
},

$project: {
_id: 0,
user: '$_id',
name: 1,
username: 1,
picture: 1,
city: 1,
kids: 1,
revenue: 1,
kidsRevRatio: 1
}
}
], function(err, result) {
// do something with err and result
});

以上代码报错如下:

Error: {"name":"MongoError","errmsg":"exception: A pipeline stage specification object must contain exactly one field.","code":16435,"ok":0}

总的来说,我是 mongo 和 db 的新手,不知道我做错了什么。

最佳答案

您的管道参数不平衡,每个阶段都是一个单独的文档,因此您需要包装每个阶段。但也存在一些其他问题

db.collection(customerTable + '_earnedinfluencers').aggregate([

{ $match: {
richness: { $gte: variable1 },
kids: { $lt: variable2 },
hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
event: { $in: schoolfestival },
}},

{ $group: {
_id: '$user',
name: { '$first': '$name' },
username: { '$first': '$username' },
picture: { '$first': '$picture' },
city: { '$first': '$city' }
kids: { '$sum': '$kids' },
revenue: { '$sum': '$dayIncome' },
kidsSum: { '$sum': '$kids' },
}},


{ $project: {
_id: 0,
user: '$_id',
name: 1,
username: 1,
picture: 1,
city: 1,
revenue: 1,
kidsSum: 1,
kidsRevRatio: { $divide: [ '$kidsSum', '$revenue' ] }
}}
], function(err, result) {
// do something with err and result
});

您将整个管道作为一个文档,而实际上它需要如图所示的一系列文档。

但实际上您想要先$match 以过滤您的结果。如果您真的想在一组之后进行一些额外的匹配,那么您可以在之后向管道中添加一个额外的匹配。

$group 操作要求 _id 分组键之外的所有字段都需要有一个“分组运算符”,你不能只得到字段由它们自己返回,除非它们是您分组的 _id 的一部分。通常您需要一个运算符,例如 $first 或以其他方式完全忽略它们。

仅限顶级分组运算符,因此像 $divide 这样的操作不是分组运算符。为了在您处理一个或多个 $sum 结果时执行此类操作,您将其移至稍后的 $project 使用具有计算值的字段。

还有像项目和组这样的操作,从管道中“删除”字段,只保留您明确包含的字段。所以你不能指定一个不存在的字段。这就是为什么 $match 排在第一位的原因之一,也是您可以使用索引的地方,而且只有在管道的开头才能这样做。

但是对于每个阶段,唯一存在的字段将是提到的字段。作为进一步的优化,“优化器”将从一开始就不会包含文档中未明确提及的任何字段。因此,只有在第一场比赛和小组赛阶段合并引用的那些才会包含在其余的管道阶段中,然后可能会再次过滤掉。

关于javascript - 这个 mongoskin 聚合命令有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25373372/

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