我正在使用mongoose ORM查询我的mongodb数据库。我在使用聚合时遇到了一个问题。我是mongodb的新手。我正在使用这个管道为聊天应用程序过滤特定用户的聊天。
MongoServerError: unknown group operator '$top'
我的聚合查询如下。
aggregate([
{
$match: {
users: ObjectId("<UserID>")
}
},
{
$group: {
_id: "$users",
out: {
$top: {
output: {
_id: "$_id",
content: "$content",
fromUser: "$fromUser",
toUser: "$toUser",
users: "$users",
messageRead: "$messageRead",
createdAt: "$createdAt"
},
sortBy: {
createdAt: -1
}
}
}
}
},
{
"$replaceRoot": {
"newRoot": "$out"
}
}
])
我同意@nimrod-serok在评论中所描述的实际错误几乎可以肯定是版本不匹配。在Atlas中检查集群的配置,以确认它在6.0
上。
也就是说,我认为你可能会以完全不同的方式处理这次行动。如果我正确地解释了聚合,那么目的是为最近的createdAt
找到一个具有给定值的users
字段的单个文档。如果是,则根本不需要$group
和随后的$replaceRoot
。
相反,只需考虑先做$sort
,然后再做{$limit: 1}
。如果您在{ users: 1, createdAt: -1 }
上另外有一个索引,那么操作应该非常有效。这是一个展示这种方法的操场。
与此相关的是,可能值得注意的是,这种替代方法可以使用简单的find()
(使用.sort()
和.limit()
(来处理,而不是使用完整的聚合框架。两者都应该是完全可以接受的。