2016-07-28 8 views
1

Diese Abtastdaten Gegeben:MongoDB aggregieren und zu transformieren Teilmenge von Daten auf der Grundlage Array von Werten

[ 
    { 
     "_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" 
      } 
     ] 
    } 
] 

ich brauche die Sammlung, wo defines.domain $in ["ism:SecurityLabel", "ntk:AccessProfileType"] und Rück ein Objekt mit jeder Domäne zur Abfrage ein Array von seiner angepaßten definiert ist, wie folgt aus:

{ 

    "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" 
     }  
    ] 
} 

habe ich versucht, meine Ergebnisse zu passen und dann projizieren, aber ich habe wirklich keine Ahnung, wie ich die Daten aus dem Format, es ist in ich muss das Format umwandeln würde.

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

Antwort

0

Bitte überprüfen Sie diese Abfrage. Das ist nicht genau so, wie du gefragt hast, aber ich denke näher. Auch wenn Sie eine Frage stellen. Bitte stellen Sie sicher, dass Ihre Testdaten gut sind. Du hast ein paar Kommas vermisst.

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

Danke, ich reparierte die Beispieldaten. – bflemi3