首页 > 解决方案 > Mongoose 如何组合查找、排序和 $ 和

问题描述

我正在使用套接字 io 编写用于聊天的 API。我在数据库中有以下数据结构。当用户 A 向用户 B 发送消息时,通过以下示例保存的数据 { "from": "A", "to": "B" }。当用户 B 响应时,结构如下 { "from": "B", "to": "A" }。

{
    "_id" : ObjectId("606ea000c9ef8e1501d610d1"),
    "message" : "I am fine!",
    "from" : "User1",
    "to" : "Plurl",
    "time" : ISODate("2021-04-08T06:17:36.757Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("606e9ff8c9ef8e1501d610d0"),
    "message" : "how are u?",
    "from" : "Plurl",
    "to" : "User1",
    "time" : ISODate("2021-04-08T06:17:28.252Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("606e9ff8c9ef8e1505d610d0"),
    "message" : "Hi?",
    "from" : "User4",
    "to" : "User3",
    "time" : ISODate("2021-04-08T06:17:28.252Z"),
    "__v" : 0
}

我需要以某种方式从数据库中为用户 A 和用户 B 获取数据,并按时间对这些数据进行排序。我正试图以这种方式做到这一点。并且可能存在仅从用户 A 到 B 的消息的情况,即如果用户 B 没有响应。

const messages = await Message.find( {
    $and: [
      { from: { $eq: req.query.user } },
      { to: { $eq: req.user.name } },
      { from: { $eq: req.user.name } },
      { to: { $eq: req.query.user } }
    ],
    sort:{
      time: -1
    }
  })

标签: node.jsmongodbexpressmongoose

解决方案


您可以使用$or运算符查找从“A”到“B”以及从“B”到“A”的消息。

以及sort按降序获取消息的方法。

const messages = await Message
  .find(
    {
      $or: [
        { from: { $eq: req.query.user }, to: { $eq: req.user.name } },
        { from: { $eq: req.user.name }, to: { $eq: req.query.user } },
      ],
    },
  )
  .sort({time: 'descending'})

或者您可以使用查询选项

const messages = await Message
  .find(
    {
      $or: [
        { from: { $eq: req.query.user }, to: { $eq: req.user.name } },
        { from: { $eq: req.user.name }, to: { $eq: req.query.user } },
      ],
    },
    null,
    { sort: { time: -1 } }, 
  )

推荐阅读