Javascript 聚合时传递字段和值
我有一个来自管道的输出文档,类似于:Javascript 聚合时传递字段和值,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,我有一个来自管道的输出文档,类似于:{upvoces:1,downvoces:5}。我只是想把它传给管道的下一部分。我是这样做的: { $group :{ _id : "$_id", upvotes : {$max : "$upvotes"}, downvotes : {$max : "$downvotes"}, average : {$avg : "$statements.result"}, count :
{upvoces:1,downvoces:5}
。我只是想把它传给管道的下一部分。我是这样做的:
{
$group :{
_id : "$_id",
upvotes : {$max : "$upvotes"},
downvotes : {$max : "$downvotes"},
average : {$avg : "$statements.result"},
count : {$max : "$count"}
}
}
我不想用max,我不想用max。我只需要字段和值:{upvoces:1,downvoces:5}
。假设它们不是数字。假设字段是对象,我希望输出该字段的所有对象,而不是最大值
让这个问题更清楚:如何在不使用max
的情况下获取字段和值的值
产出:
[ { _id: 57aea6791016c0b023a71e9d,
upvotes: 3,
downvotes: 1,
average: 7.857142857142857,
count: 5 },
{ _id: 57aed883139c1e702beb471e,
upvotes: 0,
downvotes: 1,
average: 7,
count: 1 } ]
输出很好,但我不想使用max来获得它
出于某种原因,我想我需要一个。这就是我使用
max
的原因 因为您是按“$\u id”分组的,所以实际上根本没有分组。您的结果将与初始数据集以1:1的比例关联。要完成您的要求,在不使用$max之类的聚合函数的情况下传递向上投票和向下投票,您只需将它们包含在组阶段的_id中,在该阶段中,您可以按键指定组
所以你会这样做:
{
$group :{
_id : {
"_id":"$_id",
"upvotes": "$upvotes",
"downvotes": "$downvotes"
}
average : {$avg : "$statements.result"},
count : {$max : "$count"}
}
}
但是,最终还是会与原始数据有1:1的相关性 因为您是按“$\u id”分组的,所以实际上根本没有分组。您的结果将与初始数据集以1:1的比例关联。要完成您的要求,在不使用$max之类的聚合函数的情况下传递向上投票和向下投票,您只需将它们包含在组阶段的_id中,在该阶段中,您可以按键指定组
所以你会这样做:
{
$group :{
_id : {
"_id":"$_id",
"upvotes": "$upvotes",
"downvotes": "$downvotes"
}
average : {$avg : "$statements.result"},
count : {$max : "$count"}
}
}
但是,最终还是会与原始数据有1:1的相关性 根据您的问题线索,您的问题管道很可能是操作的前一个管道步骤,因此以下建议的解决方案基于该假设。请随意提出其他建议 要使用累加器在管道中包含字段,此处使用或似乎最合适,因为您刚刚展平了一个数组,这些操作符将从每个组的第一个/最后一个文档返回一个值。这意味着,如果字段不是展平数组的一部分,则/将在发生之前给出其实际值
{
"$group" :{
"_id": "$_id",
"upvotes": { "$first": "$upvotes"},
"downvotes": { "$first": "$downvotes"},
"average": { "$avg": "$statements.result"},
"count": { "$max": "$count"}
}
}
在您的问题线程之后,您的问题管道很可能是操作的前一个管道步骤,因此以下建议的解决方案基于该假设。请随意提出其他建议 要使用累加器在管道中包含字段,此处使用或似乎最合适,因为您刚刚展平了一个数组,这些操作符将从每个组的第一个/最后一个文档返回一个值。这意味着,如果字段不是展平数组的一部分,则/将在发生之前给出其实际值
{
"$group" :{
"_id": "$_id",
"upvotes": { "$first": "$upvotes"},
"downvotes": { "$first": "$downvotes"},
"average": { "$avg": "$statements.result"},
"count": { "$max": "$count"}
}
}
在这里看不到清晰的问题?什么部分不清楚?我仍在尝试解析代码块后的语言。我的头有点痛。您不仅仅是在寻找
$group.upvots
或其他字段,因为它没有max,而是其他对象(一个有upvots,downvots)?使用$group时,您可以创建一个字段,我希望该字段的值是管道上一次输出的字段值。在我的例子中,这两个字段具有相同的名称<代码>{upvotes:1,downvotes:5}是管道上一步的输出。我希望{upvotes:1,downvotes:5}
出现在下一个输出中。一个技巧是使用max
。还有别的办法吗?不知什么原因,我想我需要一个累加器操作员。这就是为什么我使用max。在这里看不到一个清晰的问题?什么部分不清楚?我仍在尝试在代码块之后解析语言。我的头有点痛。您不仅仅是在寻找$group.upvots
或其他字段,因为它没有max,而是其他对象(一个有upvots,downvots)?使用$group时,您可以创建一个字段,我希望该字段的值是管道上一次输出的字段值。在我的例子中,这两个字段具有相同的名称<代码>{upvotes:1,downvotes:5}是管道上一步的输出。我希望{upvotes:1,downvotes:5}
出现在下一个输出中。一个技巧是使用max
。还有别的办法吗?不知什么原因,我想我需要一个累加器操作员。这就是我使用max的原因。