2016-07-21 10 views
3

Ich habe eine Folowing Objektstruktur in meiner db Sammlung:

{ 
    "name" : "test", 
    "code" : "test", 
    "attributes" : [ 
     { 
      "name" : "test1", 
      "code" : "code1" 
     }, 
     { 
      "name" : "test2", 
      "code" : "code2", 
      "value" : true 
     }, 
     { 
      "name" : "test3", 
      "code" : "code3", 
      "value" : "" 
     }, 
     { 
      "name" : "test4", 
      "code" : "code4" 
      "value" : [ 
       { 
        "code" : "code4.1", 
        "name" : "test4.1" 
       }, 
       { 
        "name" : "test4.2" 
       } 
      ] 
     } 
    ] 
} 

So "Wert" Eigenschaft kann leerer String, Boolean, Array oder gar nicht definiert.

Wie kann ich Abfragen erstellen, um Objekte aufzulisten, die nicht-leere Attribute Array haben und nicht die Eigenschaft "attributes.value" in mindestens einem Objekt in Array definiert?

p.s. Ich habe folgende Abfrage versucht:

db.collection.find({"attributes": {$exists: true, $ne: []}, "attributes.value": {$exists: false}}) 

aber Abfrageergebnis ist leer.

Antwort

5

Die $ elemMatch Betreiber trifft Dokumente, die ein Array Feld mit mindestens einem Element enthalten, das alle angegebenen Abfrage Kriterien entsprechen.

Diese Abfrage Arbeit für mich:

db.getCollection('testeur').find({ "attributes": { 
     $exists: true, 
     $ne: [], 
     $elemMatch: { "value": {$exists: false } } 
    } 
}) 
+0

Danke, das war genau das, was ich suchte. –