javascript - Mongodb geoNear 和组聚合

标签 javascript mongodb mongoose aggregation-framework

我一直在网上搜索与此相关的内容,但找不到。

我有这个聚合

 Place.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [longitude, latitude]
            },
            "spherical": true,
            "distanceField": "distance"
        }},
        { $group:
        {   _id: "$_id",
            name: { '$first': '$name' },
            distance: { $first: "$distance" }
        }
        },
        { $project : {
            name: 1,
            distance: 1,
        }}
    ],
    function(error, places) {
        if (error) return callback(error, null);
        callback(null, places)
    }
);

它可以工作,但是 geoNear 排序丢失了!

但这给了我正确排序的文档:

    Place.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [longitude, latitude]
            },
            "spherical": true,
            "distanceField": "distance"
        }}
    ],
    function(error, places) {
        if (error) return callback(error, null);
        callback(null, places)
    }
);

有什么想法吗?

为了让您了解我在这里尝试执行的操作,我使用了完整的查询

    Place.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [longitude, latitude]
            },
            "spherical": true,
            "distanceField": "distance"
        }},
        {"$unwind": "$participants" } ,
        { $group:
        {   _id: "$_id",
            name: { '$first': '$name' },
            distance: { $first: "$distance" },
            person: { $sum: 1 },
            sumof:{ $sum: "$participants.age"}
        }
        },
        { $project : {
            name: name,
            distance: 1,
            person: 1,
            meanAge:{ $divide: [ "$sumof", "$person" ]}
        }}
    ],
    function(error, places) {
        if (error) return callback(error, null);
        callback(null, places)
    }
);

最佳答案

简而言之,当您使用 $group 等运算符时无法保证返回结果的顺序。文档将按照“输入”到组管道的顺序进行处理,以遵循诸如 $first 之类的内容,但输出不一定按照输入的顺序出现.

直接来自文档:

$group does not order its output documents.

事实上,您可能会发现顺序是按分组键排列的,但在大多数情况下是相反的。

如果您想要特定的输出顺序,请使用 $sort对于最终的“输出”,这应该是您的最后一个管道阶段,因此没有其他任何东西可以改变该顺序。

Place.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [longitude, latitude]
            },
            "spherical": true,
            "distanceField": "distance"
        }},
        { "$unwind": "$participants" } ,
        { "$group": {   
            "_id": "$_id",
             "name": { "$first": "$name" },
             "distance": { "$first": "$distance" },
             "person": { "$sum": 1 },
             "sumof":{ "$sum": "$participants.age" }
        }},
        { "$project" : {
            "name": 1,
            "distance": 1,
            "person": 1,
            "meanAge": { "$divide": [ "$sumof", "$person" ]}
        }},
        { "$sort": { "distance": 1 } }
    ],
    callback
 );

关于javascript - Mongodb geoNear 和组聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115211/

相关文章:

javascript - 使用 date-fns 在日期和时间之间添加额外的单词

javascript - HAML 在使用 content_for 时有多行,用于 JavaScript

c# - 如何正确模拟 MongoDb 客户端

javascript - MongooseJS findOne() 的意外结果

javascript - 传递 model.find 作为要调用的参数会导致错误

javascript - 这是顺序运行代码片段的好方法吗?

javascript - 在 setTimeout 中调用相同的函数

mongodb - 使用聚合合并两个单独集合的记录

node.js - Mongoose 切片数组,在填充字段中

node.js - 如何用nodejs和mongoose查找文档,为什么没有结果?