【问题标题】:How to get the last 10 messages from the mongodb?如何从 mongodb 获取最后 10 条消息?
【发布时间】:2021-02-12 17:17:40
【问题描述】:

在我的项目中有一些聊天模块。我需要为每 N 条消息创建请求。如何在 frontend-node-mongo 中正确创建请求。例如,我收到了 10 条最后一条消息并向上滚动以查看以前的消息,我如何跳过它们并获取下 5 条消息?现在我可以无限制地收到所有消息。

节点

router.get(
  '/messages',
  async (req, res) => {
    try {
      const {user, destination} = req.query
      let userFrom = await User.findOne({email: user})
      let userTo = await User.findOne({email: destination})
      let messages = await Message.find({
        $or: [{senderId: userFrom, recipientId: userTo}, {senderId: userTo, recipientId: userFrom}]
      })
      return messages ? res.status(200).json(messages) : res.status(204)
    } catch (e) {
      res.status(500).json({message: "Error"})
    }
  })

【问题讨论】:

  • 只获取最后 10 条消息是否重要,或者如果显示最后 10 条消息就足够了?您可以将所有消息存储在一个数组中,然后只打印出其中的 10 个。
  • 最好从数据库中抽取一个小样本

标签: node.js mongodb express mongoose


【解决方案1】:

使用猫鼬模型,您可以使用管道功能,如跳过和限制分页。

Message.find({criteria}).skip(number_of_records_to_skip).limit(number_of_records_to_fetch)

只需根据您在 UI 上的页面大小计算您需要跳过多少,然后通过查询参数将其传递给后端。要使用 mongoose 解决方案进行完整分页,只需搜索网络或 stackoverflow。这是一个: Mongoose pagination from server side

【讨论】:

    【解决方案2】:

    我想您已经在计算限制(要显示的记录数)和跳过(要跳过的记录数)。

    您可以像下面这样简单地使用聚合管道。

    let aggregatePipelines = [
        {
            $match: {
                $or: [
                    {
                        senderId: userFrom,
                        recipientId: userTo
                    },
                    {
                        senderId: userTo,
                        recipientId: userFrom
                    }
                ]
            }
        }
    ]
    
    if (skip != 0)
        aggregatePipline.push({ $skip: skip });
    
    if (pageLimit != 0)
        aggregatePipline.push({ $limit: pageLimit });
    
    let messages = await Message.aggregate(aggregatePipelines);
    

    如果没有指定skip和limit,上述查询将简单地返回所有记录。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2016-10-12
      相关资源
      最近更新 更多