[英]Sort a result according to the size of an array with Mongoose
我正在使用 MongoDB (猫鼬),我希望按数组大小(降序)对元素进行排序。 我已经尝试了很多东西,但我不明白它是如何工作的。 我想避免手动对结果进行排序(我的意思是使用 JS),我宁愿让 MongoDB 这样做。 你能帮我吗?
这是我的代码:
users = await userModel.find({ UserStatus: "Success" })
.sort({ "Progression.Room.RoomActorLikes": { "length": -1 } })
.skip((request.pageindex) * request.pagesize)
.limit(request.pagesize);
等等...
预先感谢您的回答!
那这个呢:
db.collection.aggregate([ { $addFields:{ len:{$size:"$room.RoomActorLikes"}}} , {$sort:{len:-1}} ,{$skip: skip},
{$limit: limit} ])
详细示例:
db.collection.aggregate([
{
$match: {
UserStatus: "Success"
}
},
{
$addFields: {
len: {
$size: "$room.roomActorLikes"
}
}
},
{
$sort: {
len: -1
}
},
{
$skip: 1
},
{
$limit: 3
},
{
$project: {
len: 0
}
}
])
解释:
$match -> 这里将文档数量减少到 $match 阶段的 UserStatus-> Success 或如果有更多条件更好,因此需要在后期处理的文档数量更少。 (最好是在这个字段上有索引,所以如果你有太多的文档,尽可能减少处理)
$addFields -> 创建新的字段 len,它将包含文档数组中数组元素的数量,以便以后排序。
$sort -> 根据数组计数对文档进行降序排序。
$skip 作为分页操作的一部分显示的文档数。
$limit 作为分页操作的一部分显示的文件数。
$project 如果您在最终 output 中不需要删除 len 字段(这是可选的,因为您可能不会从应用程序方面考虑)
升技更安全的选项 $addFields->$size,防止在缺少 RoomActorlikes 或主文档中缺少房间字段的情况下出现错误消息:
{
$addFields: {
len: {
$size: {
$cond: {
if: {
$eq: [
{
$type: "$room.roomActorLikes"
},
"missing"
]
},
then: [],
else: "$room.roomActorLikes"
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.