2016-08-02 15 views
5

Wenn ich Dokumente mit ähnlicher Struktur wie folgt haben. Ich aktualisiere sie mit den Ergebnissen der Berechnungen und möchte wissen, ob das Ergebnis bereits in ein Dokument eingefügt wurde oder nicht. Nehmen wir an, für jedes Dokument führe ich die Berechnung 'c' und die Berechnung 'd' durch. Jetzt möchte ich eine Tabelle aller Dokumente anzeigen und zeigen, ob eine Berechnung 'd' bereits ausgeführt wurde. Und für diese Tabelle ist mir die Berechnung "c" egal.Wie Projekt, ob Feld existiert

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document}, 
    "d":{large embedded document} 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document} 
    } 
} 

Ich möchte ein Ergebnis erhalten, das mir sagt, ob ein Dokument ein bestimmtes Feld enthält. Zum Beispiel würde ich gerne wissen, ob es Feld "resultsOfComputation.d" enthält, egal was der Wert dieses Feldes ist.

Ein Beispiel für das Ergebnis der Abfrage für „resultsOfComputation.d“ wäre:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"resultsOfComputation":{ 
    "d":false 
    } 
} 

Wenn „resultsOfComputation.d“ ist nicht in dem Dokument auch nicht definiert werden kann, was auch in Ordnung ist:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{} 
} 

im allgemeinen ist die Idee, all Wurzelelemente der Dokumente zu bekommen, aber nur wahr/falsch/nicht definiert für das gewählte (eins) Ergebnis der Berechnung, da das Ergebnis der Berechnung ist ein großes eingebettetes Dokument .

Antwort

4

Führen Sie die folgende Aggregation Pipeline um die gewünschten Ergebnisse zu erhalten:

db.collection.aggregate([ 
    { 
     "$project": { 
      "a": 1, 
      "resultsOfComputation": { 
       "d": { "$gt": ["$resultsOfComputation.d", null] } 
      } 
     } 
    } 
]) 

Beispielausgabe

/* 1 */ 
{ 
    "_id" : 1, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : true 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : false 
    } 
} 
+1

ich von dieser Abfrage bin weggeblasen! Beeindruckend! einfach wow! Aber können Sie mir helfen zu verstehen, wie ein '$ gt' eine Ausgabe von wahr oder falsch gibt? – Nattyk

+0

Diese [verknüpfte Antwort] (http://stackoverflow.com/a/29837432/122005) erklärt alles. – chridam

+0

diese Antwort funktioniert, leider mit Aggregat war ziemlich langsam für mich, vor allem, wenn ich den Sprung in die Pipeline hinzugefügt. Am Ende habe ich nur find anstelle von aggregate verwendet, mit einer Projektion, die alle Wurzelelemente des Dokuments und ein Feld enthält, von dem ich weiß, dass es immer in "resultsOfComputation.d" ist, und dann überprüfe ich, ob dieses Feld nicht definiert ist oder nicht. – Marcel

Verwandte Themen