[英]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.