猫鼬FindOne-仅返回符合条件的字段

超越

我正在尝试查询我的比赛(游戏)集合,并确定某个用户是否已经将数据发送到“ 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,由于_ids是唯一的,因此只需指定文档即可获得单个结果

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章