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的原因。