从每个用户那里获取最新消息-猫鼬

时间:2020-10-31 17:17:24

标签: javascript mongodb express mongoose

我正在创建一个要包含聊天功能的应用程序。我要做的最后一件事是显示每个对话的最新消息(包括我发送的消息)。

我的Db看起来像这样

[
 {
 _id: 5f9b06cdb5d5eb3b94f066e3
 from: "5f860655e3fc7f43709cc408"
 to: "5f8b0a941efeb42a24f1f926"
 message: "123"
 createdAt: 2020-10-29T18:15:41.424+00:00
 updatedAt: 2020-10-29T18:15:41.424+00:00
 __v: 0
 },
 {
 _id: 5f9b0761b5d5eb3b94f066e5
 from: "5f860655e3fc7f43709cc408"
 to: "5f8b0a941efeb42a24f1f926"
 message: "321"
 createdAt: 2020-10-29T18:15:41.424+00:00
 updatedAt: 2020-10-29T18:15:41.424+00:00
 __v: 0
 }
]

我想要实现的结果:

[
 {
  message: '123',
  createdAt: 2020-10-29T18:15:41.424+00:00,
  from: "5f860655e3fc7f43709cc408"
 }
]

2 个答案:

答案 0 :(得分:1)

Chat.findOne({_ id:0,消息:1,createdAt:1,from:1})。sort({createdAt:-1})

答案 1 :(得分:0)

我认为您需要这样的东西:

db.collection.aggregate([
  {
    "$sort": {
      "createdAt": -1
    }
  },
  {
    "$project": {
      "_id": 0,
      "message": 1,
      "createdAt": 1,
      "from": 1
    }
  },
  {
    "$limit": 1
  }
])

sort用于按日期排序。在这种情况下,以最新日期为准。

project仅使用这些字段。

limit仅获得第一个。

Mongo PlayGround示例here

编辑:

如果您想通过对话进行查询(对于您的模型,我不知道该怎么做...),您可以使用$match和类似的内容:$match {"id_conver": "..."}

例如,查询匹配的“ from”和“ to”。

db.collection.aggregate([
  {
    "$match": {
      "from": "5f860655e3fc7f43709cc408",
      "to": "5f8b0a941efeb42a24f1f926"
    }
  },
  {
    "$sort": {
      "createdAt": -1
    }
  },
  {
    "$project": {
      "_id": 0,
      "message": 1,
      "createdAt": 1,
      "from": 1
    }
  },
  {
    "$limit": 1
  }
])