Как получить глубоко вложенный массив на основе некоторых конкретных критериев spring mongodb

У меня есть коллекция под названием abc (предположим), в этой коллекции у меня есть несколько документов, имеющих структуру вроде:

{
   "customerId":"Id",
   "contract":[
      {
         "contractId":"con1",
         "contractName":"conName1",
         "pricing":[
            {
               "pricingName":"priceName1",
               "billProfile":[
                  {
                     "billCode":"code1",
                     "billName":"Name1"
                  },
                  {
                     "billCode":"code2",
                     "billName":"Name2"
                  }
               ]
            },
            {
               "pricingName":"priceName2",
               "billProfile":[
                  {
                     "billCode":"code3",
                     "billName":"Name3"
                  }
               ]
            }
         ]
      },
      {
         "contractId":"con2",
         "contractName":"conName2",
         "pricing":[
            {
               "pricingName":"priceName3",
               "billProfile":[
                  {
                     "billCode":"code4",
                     "billName":"Name4"
                  },
                  {
                     "billCode":"code5",
                     "billName":"Name5"
                  }
               ]
            },
            {
               "pricingName":"priceName4",
               "billProfile":[
                  {
                     "billCode":"code6",
                     "billName":"Name6"
                  }
               ]
            }
         ]
      }
   ]
}

Для нескольких документов, подобных этим, я хочу найти конкретный код счета, а затем вернуть соответствующий шаблон счета, информацию о ценах и контрактах для этого вексельного кода. Например, если я ищу код billCode5, то соответствующий вывод из базы данных должен быть:

{
   "customerId":"Id",
   "contract":[
      {
         "contractId":"con2",
         "contractName":"conName2",
         "pricing":[
            {
               "pricingName":"priceName3",
               "billProfile":[
                  {
                     "billCode":"code5",
                     "billName":"Name5"
                  }
               ]
            }
         ]
      }
   ]
}

То, что я пробовал до сих пор:

Использование позиционного оператора $, но его можно использовать для перехода только одного уровня в документ. В результирующем наборе также включается то, что получает конкретный контракт с billCode, но неправильная оценка и billprofile.

Я знаю, что мы можем использовать агрегацию для этой цели, но я не знаю, как выполнить агрегацию при таком сложном извлечении. Мне нужно использовать aggreagtion в моем проекте java spring для извлечения данных из базы данных, а затем сохранить его в моей модели класса. Любая идея, как выполнить агрегацию в этом наборе данных?

Всего 1 ответ


Вы можете использовать $filter и $map для того же самого.

Примечание. Я не тестировал Java. Но его работа в MongoDB GUI

db.getCollection('customer').aggregate([ 
{ "$project": {
    "_id":1,
    "customerId" :1,
    "contract": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$contract",
            "as": "con",
            "in": {
              "pricing": {
                "$filter": {
                 "input": {
                    "$map": {
                  "input": "$$con.pricing",
                  "as": "pric",
                   "in" : {
                     "billProfile" : {
                       "$filter" : {
                         "input" : "$$pric.billProfile",
                          "as" : "billProf",
                          "cond": {
                                "$eq": [ "$$billProf.billCode", "code5" ] 
                            }

                       }
                     }
                   }
                }
                 },
                 "as": "pric",
                  "cond": {
                    "$and": [
                      { "$gt": [ { "$size": "$$pric.billProfile" }, 0 ] }
                    ]
                  }
                }
              }             
            }
          }
       },
       "as": "con",
        "cond": {
          "$and": [
            { "$gt": [ { "$size": "$$con.pricing" }, 0 ] }
          ]
        }
      }
     }
    }
  }
]
)

Есть идеи?

10000