2017-06-02 42 views
1

您好具有在格式的文档过滤一个阵列的子阵列:通过一些标准

{ 
    "_id":"someId", 
    "someArray":[ 
     { 
     "subId":1, 
     "subArray":[ 
      { 
       "field1":"A", 
       "filterMe":"NO" 
      }, 
      { 
       "field1":"B", 
       "filterMe":"YES" 
      } 
     ] 
     }, 
     { 
     "subId":2, 
     "subArray":[ 
      { 
       "field1":"C", 
       "filterMe":"YES" 
      }, 
      { 
       "field1":"D", 
       "filterMe":"NO" 
      } 
     ] 
     } 
    ] 
} 

如何过滤基于一些标准的子阵列。如果字段filterMe为“YES”,则示例过滤出subArray。所以最后输出json应该是这样的

{ 
    "_id":"someId", 
    "someArray":[ 
     { 
     "subId":1, 
     "subArray":[ 
      { 
       "field1":"A", 
       "filterMe":"NO" 
      } 
     ] 
     }, 
     { 
     "subId":2, 
     "subArray":[ 
      { 
       "field1":"D", 
       "filterMe":"NO" 
      } 
     ] 
     } 
    ] 
} 

我试图在下面的方式,但是,它过滤整个subArray。

db.testJson.aggregate([ 
    { $project: { 
     'someArray.subArray': { 
      $filter: { 
      input: '$someArray.subArray', 
      as: 'input', 
      cond: {$eq: ["$$input.filterMe", "YES"]} 
     }} 
    }} 
]); 
+0

看看这是否有帮助。 https://stackoverflow.com/questions/29071748/find-in-double-nested-array-mongodb – Veeram

+1

@Veeram这不是什么被问到这里 –

+0

@Neil Lunn被推荐的帖子有一个答案,不完全是你目前的答案没有额外的'$ filter'。我错过了什么 ? – Veeram

回答

2

你只需要一个$filter$map

db.junk.aggregate([ 
    { "$project": { 
    "someArray": { 
     "$filter": { 
     "input": { 
      "$map": { 
      "input": "$someArray", 
      "as": "some", 
      "in": { 
       "subId": "$$some.subId", 
       "subArray": { 
       "$filter": { 
        "input": "$$some.subArray", 
        "as": "sub", 
        "cond": { "$ne": [ "$$sub.filterMe", "YES" ] } 
       } 
       } 
      } 
      } 
     }, 
     "as": "some", 
     "cond": { "$gt": [ { "$size": "$$some.subArray" }, 0 ] } 
     } 
    } 
    }} 
]) 

产地:

{ 
     "_id" : "someId", 
     "someArray" : [ 
       { 
         "subId" : 1, 
         "subArray" : [ 
           { 
             "field1" : "A", 
             "filterMe" : "NO" 
           } 
         ] 
       }, 
       { 
         "subId" : 2, 
         "subArray" : [ 
           { 
             "field1" : "D", 
             "filterMe" : "NO" 
           } 
         ] 
       } 
     ] 
} 

我竟然包裹在一个额外$filter,以消除任何someArray项,其中过滤subArray最终成为空白SULT。里程可能因您想要做的事情而异。

+0

如何使用$存在而不是$ ne的条件? – SparkOn

+0

@SparkOn不确定你的意思。在你的问题的背景下,你要么要平等或不平等。 '$ exists'的“逻辑”形式是['$ ifNul'](https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/),但这不适用于此。要小心,因为如果你的真实数据看起来不像你问的问题,然后尝试应用到不同的东西可能不会得到相同的结果。如果你有另一个问题,那么你应该[问一个新的问题](https://stackoverflow.com/questions/ask)。这样更清楚。 –