Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于聚合查询的mongoDb高级排序_Mongodb_Mongodb Query - Fatal编程技术网

基于聚合查询的mongoDb高级排序

基于聚合查询的mongoDb高级排序,mongodb,mongodb-query,Mongodb,Mongodb Query,我正试图在mongoDb上编写一个查询,以按特定字段(storeId)对数据进行分组。每个组将有多个相同storeId的记录。我需要每个组上的记录按字段(时间戳)排序。更好的解决方案是在对每个组的记录进行排序后,只选择第一条记录,以便每个组只有一条记录。 这就是我所尝试的: const result=await deliverydays.aggregate([ { $match:{ “storeId”:{$in:storeId}, “eci.openTimeStamp”:{$ne:null},

我正试图在mongoDb上编写一个查询,以按特定字段(storeId)对数据进行分组。每个组将有多个相同storeId的记录。我需要每个组上的记录按字段(时间戳)排序。更好的解决方案是在对每个组的记录进行排序后,只选择第一条记录,以便每个组只有一条记录。 这就是我所尝试的:

const result=await deliverydays.aggregate([
{
$match:{
“storeId”:{$in:storeId},
“eci.openTimeStamp”:{$ne:null},
“eci.dayStatus”:“打开”
}
},
{
$group:{
_id:“$storeId”,
数据:{
$push:{openTimeStamp:$eci.openTimeStamp',storeId:$storeId}
},
$sort:{openTimeStamp:1}
}
}
])
它正在抱怨错误“字段“$sort”必须是累加器对象” 我也试过这个:

const result=await deliverydays.aggregate([
{
$match:{
storeId:{$in:storeId},
“eci.openTimeStamp”:{$ne:null},
“eci.dayStatus”:“打开”
}
},
{
$group:{
_id:“$storeId”,
数据:{
$push:{openTimeStamp:$eci.openTimeStamp',storeId:$storeId}
}
}
},
{
$sort:{openTimeStamp:1}
}
])
但还是不行。我意识到,第二种结构仅在我想按“\u id”或“data”排序时使用


任何帮助都将不胜感激。如果这被认为很简单,我提前表示歉意,但我是IT界的新手,而且我来自SQL server。

经过太多测试和阅读文档,我意识到mongo的排序方式与SQL world略有不同。 在对记录进行分组之前,需要对其进行排序。如果将来有人需要,最后的查询就是这样的:

        const result = await deliverydays.aggregate([
        {
            $match:{storeId:{$in:storeIds}, 
            "eci.openTimeStamp":{$ne:null}, 
            "eci.dayStatus": "OPEN"}

        },
        {
            $sort:{"eci.openTimeStamp": -1}
        },
        {
            $group:{_id: "$storeId", data:{$push:{openTimeStamp:"$eci.openTimeStamp", storeId: "$storeId"}}}
        }   
    ]) 

如果只需要第一条记录,可以尝试以下操作:

const result = await deliverydays.aggregate([
{
    $sort: {
        "openTimeStamp": -1
    }
},
{
    $group: {
        _id: "$storeId",
        data: {
            $first: {
                'openTimeStamp': '$openTimeStamp',
                'storeId': '$storeId'
            }
        }
    }
}])
如果需要返回整个记录,可以尝试
$$ROOT

const result = await deliverydays.aggregate([
{
    $sort: {
        "openTimeStamp": -1
    }
},
{
    $group: {
        _id: "$storeId",
        data: {
            $first: '$$ROOT'
        }
    }
}])

我没有包括你的
匹配
查询和
eci
前缀,所以你可以添加它们。

你应该使用
$sort:{“data.openTimeStamp”:1}
它似乎不起作用。回答很好,很干净,它完全符合问题的要求。