0

У меня есть вложенный объект JSON в виде иерархической структуры, как определено нижеПружина данных MongoDB иерархия

[ 
    { 
     "categoryId": 1, 
     "categoryName": "Category 1", 
     "childCategory": null, 
     "active": false 
    }, 
    { 
     "categoryId": 2, 
     "categoryName": "Category 2", 
     "active": true, 
     "childCategory": [ 
      { 
       "categoryId": 4, 
       "categoryName": "Category 4", 
       "childCategory": null, 
       "active": false 
      }, 
      { 
       "categoryId": 5, 
       "categoryName": "Category 5", 
       "childCategory": null, 
       "active": true 
      } 
     ] 
    }, 
    { 
     "categoryId": 10, 
     "categoryName": "Category 10", 
     "childCategory": null, 
     "active": true 
    } 
] 

От этого я хочу, чтобы выбрать все активные категории для одной структуры массива. Мой вывод должен быть

[ 
    { 
     "categoryId": 2, 
     "categoryName": "Category 2", 
     "active": true 
    }, 
    { 
     "categoryId": 5, 
     "categoryName": "Category 5", 
     "active": true 
    }, 
    { 
     "categoryId": 10, 
     "categoryName": "Category 10", 
     "active": true 
    } 
] 

Возможно ли непосредственно получить эти данные в одном запросе. Я использую данные весны для mongodb.

ответ

1

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

$redact пройти уровень документа за один раз и выполнить $$DESCEND и $$PRUNE по соответствующим критериям.

$unwind$childCategory с preserveNullAndEmptyArrays, чтобы сохранить массив с null значениями.

db.collection.aggregate({ 
    $redact: { 
     $cond: [{ 
      $eq: ["$active", true] 
     }, "$$DESCEND", "$$PRUNE"] 
    } 
}, { 
    $unwind: { 
     path: "$childCategory", 
     preserveNullAndEmptyArrays: true 
    } 
}) 
Смежные вопросы