基于聚合查询的mongoDb高级排序
我正试图在mongoDb上编写一个查询,以按特定字段(storeId)对数据进行分组。每个组将有多个相同storeId的记录。我需要每个组上的记录按字段(时间戳)排序。更好的解决方案是在对每个组的记录进行排序后,只选择第一条记录,以便每个组只有一条记录。 这就是我所尝试的:基于聚合查询的mongoDb高级排序,mongodb,mongodb-query,Mongodb,Mongodb Query,我正试图在mongoDb上编写一个查询,以按特定字段(storeId)对数据进行分组。每个组将有多个相同storeId的记录。我需要每个组上的记录按字段(时间戳)排序。更好的解决方案是在对每个组的记录进行排序后,只选择第一条记录,以便每个组只有一条记录。 这就是我所尝试的: const result=await deliverydays.aggregate([ { $match:{ “storeId”:{$in:storeId}, “eci.openTimeStamp”:{$ne:null},
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}
它似乎不起作用。回答很好,很干净,它完全符合问题的要求。