node.js - 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
}
})
解决方案
您可以使用$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 } },
)
推荐阅读
- git - 如何在不删除更改的情况下删除远程提交
- c# - 我的 Azure 通知中心中的 DefaultFullSharedAccessSignature 是什么以及在哪里
- r - 使用 RMarkdown LaTex 错误编译多个 PDF
- ios - 在 Swift 中添加模型类后,RSSelectionMenu 多项选择不起作用
- symfony - Symfony 4 中实体关系的奇怪问题
- c# - WPF DataGrid 单元格编辑中的异常
- css - 使用变换原点为 SVG 圆圈设置动画
- javascript - Google reCaptcha 的 IE11 中的 Javascript 错误
- javascript - 查看全部按钮显示隐藏的 div,然后更改为“少查看” - 如何让“少查看”重新隐藏以前隐藏的 div
- database - 如何在pentaho中用数据库连接替换笛卡尔连接