2016-07-28 5 views
1

Учитывая этот образец данные:MongoDB совокупности и преобразование подмножества данных на основе массива значений

[ 
    { 
     "_id": "5798ae78670bc85f3e3fe0df", 
     "defines": [ 
      { 
       "domain": "ism:SecurityLabel", 
       "name": "access", 
       "@id": "ntk:access" 
      }, 
      { 
       "domain": "ntk:AccessProfileType", 
       "name": "profileDes", 
       "@id": "ntk:profileDes" 
      }, 
      { 
       "domain": "ntk:AccessType", 
       "name": "requiresAllOf", 
       "@id": "ntk:requiresAllOf" 
      }, 

      { 
       "domain": "ism:SecurityLabel", 
       "name": "bannerMark", 
       "@id": "ism:bannerMark" 
      }, 
      { 
       "label": "Need-to-Know Access Profile Type", 
       "name": "AccessProfileType", 
       "@id": "ntk:AccessProfileType" 
      }, 
      { 
       "label": "Need-to-Know Access Type" 
       "name": "AccessType", 
       "@id": "ntk:AccessType" 
      } 
     ] 
    }, 
    { 
     "_id": "5798ae78670bc85f3e3fe0e1", 
     "defines": [   
      { 
       "domain": "ntk:AccessProfileType", 
       "name": "accessPolicy", 
       "@id": "ntk:accessPolicy" 
      }, 
      { 
       "domain": "ism:SecurityLabel", 
       "name": "atomicEnergyMarking", 
       "@id": "ism:atomicEnergyMarking" 
      }, 
      { 
       "domain": "ism:SecurityLabel", 
       "name": "classification", 
       "@id": "ism:classification" 
      } 
     ] 
    } 
] 

мне нужно запросить коллекцию, где defines.domain $in ["ism:SecurityLabel", "ntk:AccessProfileType"] и возвращает объект с каждым доменом, имеющим множество своего соответствующим определяет, как это:

{ 

    "ism:SecurityLabel": [ 
     { 
      "domain": "ism:SecurityLabel", 
      "name": "access" 
      "@id": "ntk:access" 
     }, 
     { 
      "domain": "ism:SecurityLabel", 
      "name": "bannerMark" 
      "@id": "ism:bannerMark" 
     }, 
     { 
      "domain": "ism:SecurityLabel", 
      "name": "atomicEnergyMarking", 
      "@id": "ism:atomicEnergyMarking" 
     }, 
     { 
      "domain": "ism:SecurityLabel", 
      "name": "classification", 
      "@id": "ism:classification" 
     } 
    ], 
    "ntk:AccessProfileType": [ 
     { 
      "domain": "ntk:AccessProfileType", 
      "name": "profileDes" 
      "@id": "ntk:profileDes" 
     }, 
     { 
      "domain": "ntk:AccessProfileType", 
      "name": "accessPolicy" 
      "@id": "ntk:accessPolicy" 
     }  
    ] 
} 

Я пытался соответствовать, а затем проецировать свои результаты, но я действительно понятия не имею, как я бы преобразовывать данные из формата в котором он находится в формате мне нужно.

{ 
    $match: { 
     'defines.domain': { $in: types } 
    } 
}, 
{ 
    $project: { 
     defines: { 
      $filter: { 
       // ??? not sure what to do ??? 
      } 
     } 
    } 
} 

ответ

0

Пожалуйста, проверьте этот вопрос. Это не совсем так, как вы просили, но я думаю ближе. Кроме того, когда вы отправляете вопрос. пожалуйста, убедитесь, что ваши данные теста хороши. вы пропустили какую-то запятую.

db.testing.aggregate([ 
    { $match: {'defines.domain': { $in: ["ism:SecurityLabel", "ntk:AccessProfileType"] } } }, 
    {$unwind:"$defines"}, 
    {$match:{"defines.domain":{$in:["ism:SecurityLabel", "ntk:AccessProfileType"]}}}, 
    {$group:{"_id":"$defines.domain",data:{$push:"$defines"}}} 
]).pretty() 
+0

Спасибо, я исправил данные образца. – bflemi3

Смежные вопросы