mongodb - Mongo:获取每个组的第一个具有匹配条件的文档
问题描述
我有带有日期、txt、发送者和接收者的消息模型。我需要获取两个用户之间的最后一条消息,例如:
{_id: 1, sender:1, receiver:2, txt: “hi 2”, date: “2018/04/01”}
{_id: 2, sender:1, receiver:2, txt: “how are you 2”, date: “2018/04/02”}
{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 4, sender:1, receiver:3, txt: “hi 3”, date: “2018/04/01”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}
如果我正在寻找涉及用户 1 的新消息,我需要:
{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}
如果无法以用户可以是发送者或接收者的方式对它们进行分组,那么这也可以:
{_id: 2, sender:1, receiver:2, txt: “how are you 2”, date: “2018/04/02”}
{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}
你们有什么感想?可以用 mongo/mongoose 做到这一点吗?我正在查看聚合和组,但我对它们不太熟悉。
解决方案
你可以这样做:
db.collectionName.aggregate([
{
$facet: {
"sender": [
{$match: {"sender" : 1}},
{$sort: {_id: -1}},
{$limit:1}
],
"receiver": [
{$match: {"receiver" : 1}},
{$sort: {_id: -1}},
{$limit:1}
]
}
},
{
$project: {
sender: { $arrayElemAt: [ "$sender", 0 ] },
receiver: { $arrayElemAt: [ "$receiver", 0 ] }
}
}
])
推荐阅读
- python - 没有响应的远程结束关闭连接(Python 3-Bugzilla)
- c# - 在页面上获取餐厅的时间列表
- php - 试图从子主题中的父主题覆盖/附加 editor-style.css
- flask - 如何从 url 规则中过滤蓝图 url?
- ios - 如何从 UILabel 文本创建 CGPathRef?
- r - 如何从长字符串中提取字符串
- php - 更改单选按钮颜色并在加载时选择第一个元素
- c - 该名称在 g_dbus_proxy_call_sync 上不可激活
- javascript - 我正在尝试显示数据库中的图像,但图像不会填充 img html 属性的 src
- isabelle - 与伊莎贝尔重温高斯和