微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mongo DB在切片之前反转数组字段

如何解决Mongo DB在切片之前反转数组字段

我有这个mongo查询获取线程中的消息列表。

await db
      .collection("threads")
      .find({
        _id: ObjectId(req.query.thread_id),})
      .project({
        messages: {
          $slice: [parseInt(req.query.offset),parseInt(req.query.limit)],},_id: 1,date_created: 1,})
      .toArray();

限制和偏移量由客户端设置,以支持无限加载。问题是查询添加顺序获得结果,而查询应首先与最后添加的消息分页。我该怎么办?是否有可能在获取数据之前对数组进行反向操作?或者负载太大?

这是我的线程模式:

{
   "_id":{
      "$oid":"5f7b32c014014100176c2a55"
   },"thread_name":"personal","messages":[
      {
         "_id":{
            "$oid":"5f7b32d414014100176c2a56"
         },"sender":{
            "$oid":"5f7b329114014100176c2a52"
         },"type":"text","date_created":{
            "$date":"2020-10-05T14:51:00.716Z"
         },"content":"hi"
      },{
         "_id":{
            "$oid":"5f7b32df14014100176c2a57"
         },"date_created":{
            "$date":"2020-10-05T14:51:11.302Z"
         },"content":"hello"
      },],"date_created":{
      "$date":"2020-10-05T14:50:40.271Z"
   },}

解决方法

您可以在聚合中使用$reverseArray选项

使用aggregate,您可以先使用$match(它将替换您的find部分),然后使用$project,您可以添加新属性,例如{{1 }},您将在其中结合使用$reverseArray$slice

所以,查询应该是这样的

reversedMessages
,

“是否有可能在取回之前可以反转数组?”您无法扭转自己没有的东西。我已经看到了$reverseArray的另一个答案,但是为什么只花$slice个最后一个元素就花一些资源来反转数组呢?

如果为负,则$ slice返回数组中的最后n个元素。如果指定n,则无法解析为负数

db.collection("threads").aggregate([
  {
    $match: {
      _id: ObjectId(req.query.thread_id),},{
    $project: {
      _id: 1,date_created: 1,reverseMessages: {
        $slice: [
          "$messages",parseInt(req.query.limit) * -1
        ]
      }
    }
  }
]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。