0
db.props.aggregate([{"$match":{release:"1"}},{"$project":{'_id':0, 'SHK.0':{"$filter":{"input":'$SHK.0.host',"as":'fil', "cond":{$in:['$$fil.Tags',"cd"]}}}}}]) 

verwenden ich das über meinen Dataset unter ::Wie wird ein Schlüsselwert in Mongodb basierend auf dem Tagnamen in einem tief verschachtelten Dokument gesucht?

{ "_id" : ObjectId("5a0eafdf481fc70d171521b1"), 
    "release" : "1", 
    "product" : "1", 
    "project" : "1", 
    "patchset" : "1", 
    "common" : { 
     "active" : "YES", 
     "javahome" : "path" }, 
    "SHK" : [ 
     { 
     "host" : { 
      "value" : "demo", 
      "Tags" : [ "ci", "cd" ] }, 
     "appserver" : { 
       "value" : "demo", 
       "Tags" : [ "ci" ] }, 
     "appname" : { 
      "value" : "demo", 
      "Tags" : [ "cd" ] } } ] } 

Aber die oben scheint nicht erhalte ich eine leere Index zu arbeiten ... Ich versuche, hier bestimmten Schlüsselwert aufgelistet abzufragen, um zu erhalten pair gemäß dem Tag-Namen vorhanden annehmen in der obigen Abfrage, wie ich cd erwähnt habe, ich sollte Wert für nur Host und appname erhalten und appserver sollte nicht im Endergebnis aufgeführt werden, da es den Tagname cd nicht enthält. Dank

Antwort

0

Ich glaube, Sie so etwas brauchen:

db.props.aggregate([{ 
     "$match": { 
      release: "1" 
     } 
    }, 
    { 
     $unwind: '$SHK' 
    }, 
    { 
     "$project": { 
      '_id': 0, 
      'tag': { 
       "$filter": { 
        "input": '$SHK.host.Tags', 
        "as": 'fil', 
        "cond": { 
         $in: ['$$fil', ["cd"]] 
        } 
       } 
      } 
     } 
    } 
]) 

Sie müssen das erste Array $unwind, in diesem Fall "SHK". Nach dem Abwickeln (Abflachen) von "SHK" ist das einzige Array das Feld "Tags". Dann können Sie den Operator $filter anwenden. Auch Sie vermissten die [] in Ihrem Zustand. Sie schrieb:

{$in:['$$fil.Tags',"cd"]} 

aber in Operator $ ist so bauen:

{ $in: [ <expression>, <array expression> ] } 

so in diesem Fall:

$in: ['$$fil', ["cd"]] 
+0

Das funktioniert gut, nicht genau die Ausgabe wollte ich aber gab mir, wenn Ein bestimmter Schlüssel enthält diesen Tag oder nicht, den ich dann programmatisch verglichen und die Schlüssel gelöscht habe, wo diese Tags nicht vorhanden waren. Vielen Dank –

Verwandte Themen