【问题标题】:MongoDB with node.js, I can not figure out how to sort group aggregation带有node.js的MongoDB,我不知道如何对组聚合进行排序
【发布时间】:2017-02-22 15:56:24
【问题描述】:

我正在使用 node.js 来处理 mongodb。我的查询给了我想要的结果,但我似乎根本无法对其进行排序,无论我尝试按什么排序。

这是一个查询示例

var query = function (db, callback) {
    var cursor = db.collection('collection').aggregate({
            $match: {
                "startdatetime": {
                    $gte: new Date([fromDate]),
                    $lte: new Date([toDate])
                }
            }
        },
        {$match: {"depth": {$gte: depthFrom, $lte: depthTo}}},
        {$unwind: "$dives"}, {$match: {"depth": {$gte: depthFrom, $lte: depthTo}}},
        {
            $group: {
                _id: {year: {$year: "$startdatetime"},depth: "depth"},
                average: {$avg: "$"+[parameter]}
            }
        }, {$sort: {year: 1,depth:1}});
    cursor.each(function (err, doc) {
        assert.equal(err, null);
        if (doc != null) {
            console.log(doc);
        } else {
            callback();
        }
    })
};

从这里我得到这个结果:

{ _id: { year: 2015, depth: 17.5 }, average: 7.809660041265659 }
{ _id: { year: 2015, depth: 16.5 }, average: 7.849712114661603 }
{ _id: { year: 2016, depth: 17.5 }, average: 7.402677186121112 }
{ _id: { year: 2016, depth: 16.5 }, average: 7.565136208888859 }

我希望得到这样的结果(按年份,然后按深度):

{ _id: { year: 2015, depth: 16.5 }, average: 7.849712114661603 }
{ _id: { year: 2015, depth: 17.5 }, average: 7.809660041265659 }
{ _id: { year: 2016, depth: 16.5 }, average: 7.565136208888859 }
{ _id: { year: 2016, depth: 17.5 }, average: 7.402677186121112 }

我尝试按_id:1、年份和深度排序,但无论我单独尝试还是组合尝试,结果都没有任何反应。

我做错了吗?

提前致谢。

【问题讨论】:

  • 发布您收藏的示例文档

标签: javascript node.js mongodb sorting mongodb-aggregation


【解决方案1】:

问题在于yeardepth 参数在_id 对象下。所以你应该使用:

{$sort: {'_id.year': 1, '_id.depth':1 }}

或者您可以在排序之前添加一个项目阶段并删除_id嵌套:

{$project: {_id: 0, year: '$_id.year', depth: '$_id.depth', average: 1 }}

【讨论】:

  • 对不起,应该提到我已经尝试了你的第一个建议,但它不起作用。你的第二个建议也没有。这两个问题的解决方案是我在寻找解决方案时找到的,但无论我尝试按什么排序,都没有任何改变......
【解决方案2】:

我想通了!这是一个奇怪的问题......我在玩弄$project 之后发现如果$project 在查询的末尾,它会被忽略,所以我尝试将两个$sort 放在一起。事实证明,我的查询中最后的内容被忽略了。所以现在,我的查询的结尾是这样的:

 {$sort:{year:-1}},{$sort:{year:-1}});

我不知道这对我来说是否是一个特殊情况,或者它是否是一个“正常”的错误,但希望我可以帮助其他人摆脱我所经历的挫败感。

【讨论】:

    猜你喜欢
    • 2019-12-26
    • 2020-10-12
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多