2016-12-06 3 views
1

Ich habe dieses DokumentMehrere Filter in MongoDB Abfrage

{ 
    "_id" : ObjectId("6afda532e9a0e3838537c71a"), 
    "VersionId" : 0, 
    "NodeId" : [ 
     { 
      "NodeId" : 0, 
      "Host" : "127.0.0.1", 
      "DatabaseName" : "NodeId0", 
      "Collection" : [ 
       { 
        "CollectionId" : 0, 
        "CollectionName" : "Codice0" 
       }, 
       { 
        "CollectionId" : 1, 
        "CollectionName" : "Codice1" 
       } 
      ] 
     }, 
     { 
      "NodeId" : 1, 
      "Host" : "127.0.0.2", 
      "DatabaseName" : "NodeId1", 
      "Collection" : [ 
       { 
        "CollectionId" : 1, 
        "CollectionName" : "Codice1" 
       } 
      ] 
     } 
    ] 
} 

und möchte für CollectionId nur 1 eingereicht von nodeId und 1 Feld extrahieren, ist es möglich?

Das zurückgegebene Dokument sollte diese Struktur hat:

{ 
    VersionId: 0, 
    NodeId: { 
     NodeId: 0, 
     Collection: { 
      CollectionId: 0, 
      CollectionName: Codice0 
     } 
    } 
} 

ich diese Abfrage versuchte, ohne Erfolg:

let queryDatabasePath = collezioneDbPath.aggregate([ 
    { $match: { "VersionId" : versionId } }, 
    { $project: { 
     NodeId : { $filter: { 
      input: '$NodeId', 
      as: 'prova', 
      cond: {$and: [ 
       {$eq: ['$$prova.NodeId' , nodeId ]}, 
       {$filter: { 
        input:'$prova', 
        as: 'prova1', 
        cond: {$eq: ['$$prova1.Collection.CollectionId', collectionId]} 
       }} 

      ]} 

     } }, 
     //"NodeId.Collection.CollectionId" : 1, 
     _id: 0 
    } } 
], function (err, res) { 
    console.log(res); 
}); 

Antwort

2

Wenn Sie mit „VERSIONID“ tun oder mit _ID dann wie folgenden Art und Weise angemessen führen :

db.getCollection('a').aggregate([ 
{$unwind: '$NodeId'}, 
{$unwind: '$NodeId.Collection'}, 
{$match: {"_id" : ObjectId("5846b47c8254f4cad9acadce"), "VersionId" : 0, "NodeId.NodeId": 0, "NodeId.Collection.CollectionId": 0}} 
]) 

Ausgabe wie ein unter Daten:

{ 
    "_id" : ObjectId("5846b47c8254f4cad9acadce"), 
    "VersionId" : 0, 
    "NodeId" : { 
     "NodeId" : 0, 
     "Host" : "127.0.0.1", 
     "DatabaseName" : "NodeId0", 
     "Collection" : { 
      "CollectionId" : 0, 
      "CollectionName" : "Codice0" 
     } 
    } 
} 
+0

Vielen Dank für Ihre schnelle Antwort, Problem gelöst! : D –

2

Sie können etwas wie unten versuchen. Nutzen Sie $map die erforderlichen Felder zu projizieren und $filter zum Filtern verwenden passende Knoten und Sammlung und $arrayElemAt das Array zu ändern, um das Objekt das erwartete Ausgabeformat anzupassen.

aggregate([{ 
    $match: { 
     "VersionId": 0 
    } 
}, { 
    $project: { 
     NodeId: { 
      $arrayElemAt: [{ 
       $map: { 
        input: { 
         $filter: { 
          input: "$NodeId", 
          as: "prova", 
          cond: { 
           $eq: ["$$prova.NodeId", 0] 
          } 
         } 
        }, 
        as: "nd", 
        in: { 
         "NodeId": "$$nd.NodeId", 
         "Collection": { 
          $arrayElemAt: [{ 
           $filter: { 
            input: "$$nd.Collection", 
            as: "proval", 
            cond: { 
             $eq: ["$$proval.CollectionId", 0] 
            } 
           } 
          }, 0] 
         } 
        } 
       } 
      }, 0] 
     }, 
     _id: 0 
    } 
}]) 
+0

Vielen Dank für Ihre schnelle Antwort, Sie haben mein Problem auch gelöst. : D –

+0

@MarcoTribuzio diese Antwort löst nicht nur Ihr Problem, sondern zeigt Ihnen, wie Sie es tun sollten. Vielleicht fällt Ihnen das schwer zu verdauen. Es wird besser funktionieren. – styvane