NodeJS 使用Mongoose根据数组的大小对结果进行排序

pod7payv  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(104)

我正在使用MongoDB(mongoose),我希望通过数组大小(降序)对元素进行排序。我已经尝试了很多方法,但我不明白它是如何工作的。我想避免手动对结果进行排序(我的意思是使用JS),我宁愿让MongoDB来做。你能帮助我吗?
下面是我的代码:

users = await userModel.find({ UserStatus: "Success" })
  .sort({ "Progression.Room.RoomActorLikes": { "length": -1 } })
  .skip((request.pageindex) * request.pagesize)
  .limit(request.pagesize);

字符串
Here is an example that could be the first result:
The second would be:
等等......
提前感谢您的回答!

odopli94

odopli941#

那这个呢

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阶段或如果有更多的条件更好,所以需要在以后的阶段处理的文件数量要小.(最好是有这个字段的索引,所以如果你有太多的文件,这以减少处理尽可能多)
1.$addFields ->创建新的field len,它将包含文档数组中数组元素的数量,以便稍后排序。
1.$sort ->根据数组计数对文档进行降序排序。
1.$skip作为分页操作的一部分显示的文档数。
1.$限制分页操作中显示的文档数量。
1.$project用于在最终输出中不需要时删除len字段(这是可选的,因为您可能不会从应用程序端考虑它)
playground
一个更安全的选项$addFields->$size,防止在缺少RoomActorlikes或缺少主文档中的房间字段的情况下出现错误消息:

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


playground safe option ( checking if RoomActorLikes exist )

相关问题