繁体   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