2016-10-18 3 views
0

Ich habe eine Sammlung mit Dokumenten mit dieser Struktur:Dokumentensuche Feld in Mongo Referenzierung

{ 
    'travellers': [ 'a', 'b', 'c', 'd' ], 
    ... 
    'authorized-travellers': { 
    'a' => { 
     creator => 'admin', 
     authorized => true, 
     when => '2016-18-10 22:45:45', 
    }, 
    'd' => { 
     creator => 'admin', 
     authorized => false, 
     when => '2016-17-10 12:44:00', 
    }, 
    } 
} 

und ich brauche eine Abfrage alle Dokumente zu finden, die Reisenden Genehmigungen hat anhängig.

Eine Reise (Dokument) hat ausstehende Reisende Berechtigungen, wenn travellers.count weniger als "autorisierte Reisende" Schlüssel ist.

In diesem Beispiel hat diese Reise 2 ausstehende Berechtigungen: b und c.

Ist dies möglich (in Perl) oder muss ich die Abfrage manuell durchführen? Wie?

Dank

+0

Ok, können Sie mich wissen lassen, wie es geht? –

+0

@simbabque: Eagerly warten, um die Unterschiede zwischen ihnen von Ihnen zu lernen. – ssr1012

+2

@ ssr1012 _Perl_ ist der Name der Sprache. _perl_ ist der Name des Perl-Compilers (die Binärdatei, die Perl-Code ausführt). _PERL_ hat nichts mit der Sprache Perl zu tun. Sie können [auf Wikipedia] (https://en.wikipedia.org/wiki/Perl#Name) lesen, aber die wichtigste Quelle ist [perlfaq1] (http://perldoc.perl.org/perlfaq1.html#What's -the-difference-zwischen-% 22perl% 22-und-% 22Perl% 22% 3f), wo es sagt _But nie schreiben "PERL", weil perl ist kein Akronym._. – simbabque

Antwort

1

Es gibt keinen einfachen Weg, um die Server-Seite zu tun. Möglicherweise können Sie eine $where-Funktion erstellen.

Wenn möglich, würde ich versuchen, das Schema zu überarbeiten, um die ausstehende Zählung (oder boolesches Flag) als eine Invariante im Dokument selbst zu behalten. Aktualisieren Sie bei der Aktualisierung travellers und authorized-travellers die pending Anzahl/Flag gleichzeitig als atomare Operation. Dann wäre die Abfrage nach ausstehenden Berechtigungen trivial.

Um vorhandene Dokumente zu aktualisieren, um die Invariante hinzuzufügen, müssen Sie bei Datenrennen vorsichtig sein, wenn diese häufig aktualisiert werden.

Wenn eine Schemaänderung nicht möglich ist, dann ist das Durchschleifen der Dokumente auf der Clientseite und die individuelle Prüfung einfach, wenn auch ineffizient. Wenn viele Dokumente und viele Daten pro Dokument vorhanden sind, stellen Sie sicher, dass nur die benötigten Felder zurückgesendet werden.

Hoffe, diese Ideen helfen.