簡體   English   中英

使用 Mongoose 根據數組的大小對結果進行排序

[英]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
                    }
       }
      ])

解釋:

  1. $match -> 這里將文檔數量減少到 $match 階段的 UserStatus-> Success 或如果有更多條件更好,因此需要在后期處理的文檔數量更少。 (最好是在這個字段上有索引,所以如果你有太多的文檔,盡可能減少處理)

  2. $addFields -> 創建新的字段 len,它將包含文檔數組中數組元素的數量,以便以后排序。

  3. $sort -> 根據數組計數對文檔進行降序排序。

  4. $skip 作為分頁操作的一部分顯示的文檔數。

  5. $limit 作為分頁操作的一部分顯示的文件數。

  6. $project 如果您在最終 output 中不需要刪除 len 字段(這是可選的,因為您可能不會從應用程序方面考慮)

操場

升技更安全的選項 $addFields->$size,防止在缺少 RoomActorlikes 或主文檔中缺少房間字段的情況下出現錯誤消息:

          {
           $addFields: {
          len: {
    $size: {
      $cond: {
        if: {
          $eq: [
            {
              $type: "$room.roomActorLikes"
            },
            "missing"
          ]
        },
        then: [],
        else: "$room.roomActorLikes"
        }
       }
     }
    }
   }

游樂場安全選項(檢查 RoomActorLikes 是否存在)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM