【问题标题】:Mongo aggregation, call $match on array elements not working. (reproduction included)Mongo 聚合,在数组元素上调用 $match 不起作用。 (包括复制)
【发布时间】:2020-03-27 12:58:26
【问题描述】:

https://mongoplayground.net/p/dsMlfEdSkXP

我想查询广播者用户支持的文档。在链接中,broadcasterUser id 是“23435553”

在结果中,不应返回带有 "_id": ObjectId("5e7d7c35d86d85088863f4df")" 的文档,因为广播公司的 voteType 是 "downVote"。

应该返回带有“_id”的文档:ObjectId(“5e7d7c47d86d85088863f4e0”),因为广播者的voteType是“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 运算符所需的逻辑是“查找建议文档,其中在 votes 数组中存在 user.id="23435553" AND voteType="upVote" 的对象。

【问题讨论】:

  • 这能回答你的问题吗? Retrieve only the queried element in an object array in MongoDB collection 您需要使用filter 从数组中返回所需的元素,一般来说,如果您使用$match,如果至少有一个元素符合条件,它将返回整个数组(最终是相应的文档)!!跨度>
  • 嗯,我不是要过滤 votes 数组。我试图排除文档本身,因为广播公司的反对票出现在 votes 数组中,如果这有意义的话。
  • 对数组中的子文档指定多个条件时,必须使用$elemMatch - Specify Multiple Conditions for Array of Documents
  • @EricGuan :如果我理解正确,您是否希望基于数组返回更少的元素,而不是取决于少数条件正确(此外,如果在投票数组中不匹配 - 整个文档也可以从结果中删除)?如果是 - 那么$filter 应该适合您,您尝试过还是需要查询?
  • @whoami 对不起,没有。我想过滤文档,而不是数组。但过滤逻辑需要在数组中搜索匹配多个条件的特定对象。

标签: mongodb


【解决方案1】:

要从数组中返回特定元素,您需要在投影上执行$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://mongoplayground.net/p/J9O-HzHnQNP

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 2017-08-20
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多