在最简单的意义上,这只是遵循了
   
    "dot notation"
   
   如MongoDB所用。无论内部数组成员在哪个数组成员中,只要它匹配一个值,它都可以工作:
  
  db.mycollection.find({
    "someArray.someNestedArray.name": "value"
})
  
   对于“单个字段”值,对于匹配要使用的多个字段,这是很好的
   
    
     $elemMatch
    
   
   :
  
  db.mycollection.find({
    "someArray": { 
        "$elemMatch": {
            "name": "name1",
            "someNestedArray": {
                "$elemMatch": {
                    "name": "value",
                    "otherField": 1
                }
            }
        }
    }
})
  
   它与文档匹配,该文档将包含与值匹配的“路径”处的字段。如果您打算“匹配并过滤”结果,因此只返回匹配的元素,那么位置运算符投影不可能这样做,
   
    as quoted
   
   :
  
  
   
    
     嵌套数组
    
   
   
    位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值
   
  
  
   现代MongoDB
  
  
   我们可以通过申请
   
    
     $filter
    
   
   和
   
    
     $map
    
   
   在这里。这个
   
    美元地图
   
   是真正需要的,因为“内部”数组可以由于“过滤”而改变,“外部”数组当然与“内部”被剥夺所有元素时的条件不匹配。
  
  
   再次遵循在每个数组中实际要匹配多个属性的示例:
  
  db.mycollection.aggregate([
  { "$match": {
    "someArray": {
      "$elemMatch": {
         "name": "name1",
         "someNestedArray": {
           "$elemMatch": {
             "name": "value",
             "otherField": 1
           }
         }
       }
    }
  }},
  { "$addFields": {
    "someArray": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$someArray",
            "as": "sa",
            "in": {
              "name": "$$sa.name",
              "someNestedArray": {
                "$filter": {
                  "input": "$$sa.someNestedArray",
                  "as": "sn",
                  "cond": {
                    "$and": [
                      { "$eq": [ "$$sn.name", "value" ] },
                      { "$eq": [ "$$sn.otherField", 1 ] }
                    ]
                  }
                }
              }             
            }
          },
        },
        "as": "sa",
        "cond": {
          "$and": [
            { "$eq": [ "$$sa.name", "name1" ] },
            { "$gt": [ { "$size": "$$sa.someNestedArray" }, 0 ] }
          ]
        }
      }
    }
  }}
])
  
   因此在“外部”数组上
   
    
     滤器
    
   
   实际上是看
   
    
     $size
    
   
   在“内部”数组本身被“过滤”之后,所以当整个内部数组实际上与noting匹配时,可以拒绝这些结果。
  
  
   旧版MongoDB
  
  
   为了只“投影”匹配的元素,您需要
   
    
     .aggregate()
    
   
   方法:
  
  db.mycollection.aggregate([
    // Match possible documents
    { "$match": {
        "someArray.someNestedArray.name": "value"
    }},
    // Unwind each array
    { "$unwind": "$someArray" },
    { "$unwind": "$someArray.someNestedArray" },
    // Filter just the matching elements
    { "$match": {
        "someArray.someNestedArray.name": "value"
    }},
    // Group to inner array
    { "$group": {
        "_id": { 
            "_id": "$_id", 
            "name": "$someArray.name"
        },
        "someKey": { "$first": "$someKey" },
        "someNestedArray": { "$push": "$someArray.someNestedArray" }
    }},
    // Group to outer array
    { "$group": {
        "_id": "$_id._id",
        "someKey": { "$first": "$someKey" },
        "someArray": { "$push": {
            "name": "$_id.name",
            "someNestedArray": "$someNestedArray"
        }}
    }} 
])
  
   它允许您为文档中的一个或多个结果“筛选”嵌套数组中的匹配项。