MongoDB:从数组中分别获取所有$matched元素

MongoDB:从数组中分别获取所有$matched元素,mongodb,mongoose,nosql,mongodb-query,aggregation-framework,Mongodb,Mongoose,Nosql,Mongodb Query,Aggregation Framework,我试图分别获取所有匹配的元素,即示例数据和查询 // json [ { "name": "Mr Cool", "ican": [ { "subcategory": [ { "id": "5bffdba824488b182ec86f8d", "name": "Cricket" }, { "id": "5bffdba824488b182ec86f

我试图分别获取所有匹配的元素,即示例数据和查询

// json
[
  {
    "name": "Mr Cool",
    "ican": [
      {
        "subcategory": [
          {
            "id": "5bffdba824488b182ec86f8d", "name": "Cricket"
          },
          {
            "id": "5bffdba824488b182ec86f8c", "name": "Footbal"
          }
        ],
        "category": "5bffdba824488b182ec86f88",
        "name": "Sports"
      }
    ]
  }
]

// query
db.collection.aggregate([
  {
    "$match": {
      "ican.subcategory.name": { $in: ["Cricket","Football"] }
    }
  },
  {
    "$project": { "_id": 1, "name": 1, }
  }
])
我得到了综合结果,我需要个人比赛记录。我尝试了
$all
$elementMatch
但得到了相同的响应。我怎样才能得到下面的结果。我正在使用
$aggregate
,因为我将使用
$geoNear
管道来获取附近的用户

// current result
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool"
  }
]

// expected result
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool",
    "subcategory: "Cricket"
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool",
    "subcategory: "Footbal"
  }
]
谢谢

试试这个


您可以在不使用和的情况下使用以下聚合,以获得更好的性能

db.collection.aggregate([
  { "$match": { "ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
  { "$project": {
    "ican": {
      "$reduce": {
        "input": "$ican",
        "initialValue": [],
        "in": {
          "$concatArrays": [
            { "$filter": {
              "input": {
                "$map": {
                  "input": "$$this.subcategory",
                  "as": "s",
                  "in": { "name": "$name", "subcategory": "$$s.name" }
                }
              },
              "as": "fil",
              "cond": { "$in": ["$$fil.subcategory", ["Football"]] }
            }},
            "$$value"
          ]
        }
      }
    }
  }},
  { "$unwind": "$ican" },
  { "$replaceRoot": { "newRoot": "$ican" }}
])

如果
ican
也会有多个元素呢?是的,它会有多个元素。谢谢你的回答,我会试试这个。干杯:)如果你想按id分组,你可以使用“\u id”:“$\u id”而不是“\u id”:Null只是想知道其他可能性,使用
$project
或其他什么。谢谢你的回答和时间,这个查询也非常有效。使用
$unwind
是否会降低查询的性能。是<代码>$REWIND是aggregationOh中代价高昂的阶段,好吧。似乎我必须花更多的时间阅读文档:)谢谢。您好,我发现这个查询有一个问题,它没有过滤数组中的数据,如果数组中只有足球,那么它会显示板球和足球@sanprodev是的,与
$unwind
db.collection.aggregate([
  { "$match": { "ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
  { "$project": {
    "ican": {
      "$reduce": {
        "input": "$ican",
        "initialValue": [],
        "in": {
          "$concatArrays": [
            { "$filter": {
              "input": {
                "$map": {
                  "input": "$$this.subcategory",
                  "as": "s",
                  "in": { "name": "$name", "subcategory": "$$s.name" }
                }
              },
              "as": "fil",
              "cond": { "$in": ["$$fil.subcategory", ["Football"]] }
            }},
            "$$value"
          ]
        }
      }
    }
  }},
  { "$unwind": "$ican" },
  { "$replaceRoot": { "newRoot": "$ican" }}
])