我正在尝试查询我的比赛(游戏)集合,并确定某个用户是否已经将数据发送到“ reportMessages”对象数组。
const results = await Match.findOne({ 'users': req.params.userIdOfReportSender, '_id': req.params.matchId, 'reportMessages.sentBy': req.params.userIdOfReportSender }, 'reportMessages' )
但是,以上查询返回以下内容:
{
_id: 5fd382c65d5395e0778f2f8a,
reportMessages: [
{
_id: 5fd610f27ae587189c45b6ca,
content: 'jajatest',
timeStamp: 2020-12-13T13:02:42.102Z,
sentBy: 'XbVvm6g3nsRmPg3P1pBvVl84h6C2'
},
{ sentBy: "'anotheruser123" }
]
}
我如何才能只返回第一个reportMessage,即XbVvm6g3nsRmPg3P1pBvVl84h6C2发送的报告?
Mongoose findOne docs(https://mongoosejs.com/docs/api.html#model_Model.findOne)显示,您可以提供参数来说明要选择的字段(在其情况下为“名称长度”,但不显示方法)仅在满足特定条件的情况下才选择字段。
这有可能吗?尝试搜索这个看似简单的问题已有一段时间,但没有成功
亲切的问候
您可以通过此聚合查询获取所需的子文档:
Match.aggregate([
{
$match: { _id: req.params.matchId }
},
{
$project: {
reportMessages: {
$filter: {
input: '$reportMessages',
as: 'msg',
cond: { $eq: ['$$msg.sentBy', req.params.userIdOfReportSender] }
}
}
}
},
{
$project: {
reportMessage: { $arrayElemAt: [ '$reportMessages', 0 ] },
}
},
{ $replaceWith: '$reportMessage' }
]);
请注意_id
,由于_id
s是唯一的,因此只需指定文档即可获得单个结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句