Mongo聚合,对数组元素不起作用调用$ match。 (包括复制)

时间:2020-03-27 04:36:29

标签: mongodb

https://mongoplayground.net/p/dsMlfEdSkXP

我想查询broadcasterUser推荐的文档。在链接中,broadcasterUser id为“ 23435553”

结果中,不应返回带有“ _id”:ObjectId(“ 5e7d7c35d86d85088863f4df”),“的文档,因为广播公司的表决类型为” downVote“。

应该返回带有“ _id”的文档:ObjectId(“ 5e7d7c47d86d85088863f4e0”),因为广播公司的表决类型为“ upVote”。

为什么我的$ match条件不起作用?

  {
    $match: {
      "votes.user.id": "23435553",
      "votes.voteType": "upVote",
    }
  }

编辑:找到了我的答案,谢谢@prasad。 https://mongoplayground.net/p/I_W0_BIIVVO

db.suggestions.aggregate([
  {
    $match: {
      "channelId": "23435553",

    }
  },
  {
    $lookup: {
      from: "votes",
      localField: "_id",
      foreignField: "suggestionId",
      as: "votes"
    }
  },
  {
    $match: {
      "votes": {
        "$elemMatch": {
          "user.id": "23435553",
          "voteType": "upVote",

        }
      },

    }
  },

])

我没有尝试进行任何数组过滤。我试图根据数组中是否存在对象来过滤文档

使用第二个$ match运算符所需的逻辑是“查找建议文档,其中的投票数组中存在一个带有user.id =“ 23435553”和voteType =“ upVote”的对象。

1 个答案:

答案 0 :(得分:0)

要从数组中返回特定元素,您需要对投影执行$filter。而不是$match,您上一次的管道查询将是这样

{
    $project: {
      _id: 1, user: 1,
      votes: {
        $filter: {
          input: "$votes",
          as: "item",
          cond: {
            $and: [
              {
                $eq: [
                  "$$item.user.id",
                  "23435553"
                ]
              },
              {
                $eq: [
                  "$$item.voteType",
                  "upVote"
                ]
              }
            ]
          }
        }
      }
    }
  }

该解决方案也在操场上完成

https://github.com/jbkunst/highcharter