Монго фильтр массив массив массив - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь отфильтровать список массивов массивов массивов, это пример структуры.

{
    "array1": [
    {
        "array2": [
            {
                "array3": [
                    {
                        "sampleId": 1
                    },
                    {
                        "sampleId": 2
                    },
                    {
                        "sampleId": 5
                    }
                ]
            },
            {
                "array3": [
                    {
                        "sampleId": 7
                    },
                    {
                        "sampleId": 8
                    }
                ]
            }
        ]
    },
    {
        "array2": [
            {
                "array3": [
                    {
                        "sampleId": 1
                    }
                ]
            }
        ]
    }
]
}

Допустим, я хочу отфильтровать все вложенные документы с sampleId> 2

это пример ожидаемого результата.

{
"array1": [
    {
        "array2": [
            {
                "array3": [
                    {
                        "sampleId": 1
                    },
                    {
                        "sampleId": 2
                    }
                ]
            },
            {
                "array3": []
            }
        ]
    },
    {
        "array2": [
            {
                "array3": [
                    {
                        "sampleId": 1
                    }
                ]
            }
        ]
    }
]
}

Я пытался использовать метод агрегации / карты / фильтра, как описано в этом посте и других, но результаты всегдадавая массив 3 пустым.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете попробовать агрегацию ниже

В основном вам нужно перебрать каждый массив с помощью $map агрегации и, наконец, использовать $filter с последним.

db.collection.aggregate([
  { "$project": {
    "array1": {
      "$map": {
        "input": "$array1",
        "as": "a1",
        "in": {
          "array2": {
            "$map": {
              "input": "$$a1.array2",
              "as": "a2",
              "in": {
                "array3": {
                  "$filter": {
                    "input": "$$a2.array3",
                    "as": "a3",
                    "cond": { "$lte": ["$$a3.sampleId", 2] }
                  }
                }
              }
            }
          }
        }
      }
    }
  }}
])

Выход

[
  {
    "array1": [
      {
        "array2": [
          {
            "array3": [
              {
                "sampleId": 1
              },
              {
                "sampleId": 2
              }
            ]
          },
          {
            "array3": []
          }
        ]
      },
      {
        "array2": [
          {
            "array3": [
              {
                "sampleId": 1
              }
            ]
          }
        ]
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...