Mongo DB: Wie wähle ich Elemente mit verschachtelten Array-Anzahl 0

7

Die Datenbank ist in der Nähe von 5 GB. Ich habe Dokumente wie:

%Vor%

Ich möchte Nutzer zurückgeben, die mehr als 0 "Hobbies" haben Ich habe es versucht

%Vor%

und es dauert alles RAM und kein Ergebnis.

  1. Wie führt man diese Auswahl durch?
  2. Und wie kann ich nur zurückgeben: ID, Name, Anzahl?
  3. Wie geht es mit c # offiziellen Treiber?

TIA

P.S. in der Nähe habe ich Folgendes gefunden: "Füge ein neues Feld hinzu, um die Kategoriengröße zu ändern. Es ist eine übliche Praxis in der Mongo-Welt." ist das wahr?

    
1gn1ter 26.09.2011, 07:05
quelle

6 Antworten

8

Haben Sie versucht, hobbies.length zu verwenden? Ich habe dies nicht getestet, aber ich glaube, das ist der richtige Weg, um den Bereich des Arrays in Mongodb abzufragen

%Vor%     
RameshVel 26.09.2011, 08:17
quelle
16

In diesem speziellen Fall können Sie die Indexierung der Liste verwenden, um Ihr Problem zu lösen:

db.collection.find({"hobbies.0" : {$exists : true}}).limit(10)

Dies stellt nur sicher, dass ein 0. Element existiert. Sie können dasselbe tun, um sicherzustellen, dass die Liste kürzer als n oder zwischen x und y ist, indem Sie die vorhandenen Elemente an den Enden des Bereichs überprüfen.

    
Parker 23.08.2013 21:59
quelle
7

Sie können einen bestimmten Bereich von Array-Längen mit dem $size -Operator überprüfen, indem Sie eine logische $not :

verwenden %Vor%     
jayelm 12.05.2014 15:47
quelle
2

Das stimmt irgendwie.

Laut Handbuch

Ссылка

  

$ size

     

Der Operator $ size entspricht jedem Array mit der angegebenen Anzahl von   Elemente. Das folgende Beispiel würde dem Objekt {a: ["foo"]} entsprechen,   da dieses Array nur ein Element hat:

%Vor%
  

Sie können $ size nicht verwenden, um eine Reihe von Größen zu finden (zum Beispiel: Arrays   mit mehr als 1 Element). Wenn Sie einen Bereich abfragen müssen, erstellen Sie ein   zusätzliches Größenfeld, das Sie beim Hinzufügen von Elementen erhöhen

Sie können also nach der Array-Größe 0 suchen, aber nicht nach Dingen wie 'größer als 0'

    
JohnP 26.09.2011 07:12
quelle
1

In früheren Fragen wird erläutert, wie das Array-Count-Problem behandelt wird. Obwohl in Ihrem Fall, wenn ZERO wirklich der einzige Wert ist, auf den Sie testen möchten, könnten Sie das Array auf null setzen, wenn es leer ist und die Option nicht serialisieren, dann können Sie das Vorhandensein dieses Feldes testen. Denken Sie daran, auf Null zu testen und das Array zu erstellen, wenn Sie einem Benutzer ein Hobby hinzufügen möchten.

Für # 2, vorausgesetzt, Sie haben das Zählfeld hinzugefügt, ist es einfach, die gewünschten Felder aus der Datenbank auszuwählen und das Zählfeld einzufügen.

    
Ian Mercer 26.09.2011 07:11
quelle
0
  1. Wenn Sie nur Null Hobbies suchen müssen, und wenn die Hobbies-Taste nicht für jemanden mit Null-Hobbys eingestellt ist, verwenden Sie die EXISTS-Flagge. Fügen Sie einen Index für "Hobbies" zur Leistungssteigerung hinzu:

    db.collection.find ({hobbies: {$ exists: true}});

  2. Wenn jedoch die Person mit null Hobbys leeres Array hat und Person mit 1 Hobby ein Array mit 1 Element hat, dann verwenden Sie diese generische Lösung:

Pflegen Sie eine Variable namens "hcount" (Hobbycount), und setzen Sie sie immer gleich der Größe des Hobbys-Arrays in jedem Update. Index auf dem Feld "hcount" Dann können Sie eine Abfrage wie folgt durchführen:

%Vor%

3 - Von @Johns antwortet, "$ size" ist auch ein guter Operator für diesen Zweck.   Ссылка

    
DhruvPathak 26.09.2011 07:17
quelle

Tags und Links