2011-01-11 1 views
2

Ich habe eine Anwendung, die Daten aus einem mongoDB mit den mongoDB C# Fahrern so etwas wie dies fragt:Wie Batch-Dokumente mit MongoDB abrufen?

public void main() 
{ 
    foreach (int i in listOfKey) 
    { 
     list.add(getObjectfromDB(i); 
    } 
} 

public myObject getObjFromDb(int primaryKey) 
{ 
    document query = new document(); 
    query["primKey"] = primaryKey; 
    document result= mongo["myDatabase"]["myCollection"].findOne(query); 
    return parseObject(result); 
} 

Auf meiner lokalen (Entwicklung) Maschine 100 Objekt auf diese Weise als eine Sekunde weniger bekommen dauert. Ich habe jedoch kürzlich die Datenbank auf einen Server im Internet verschoben, und diese Abfrage dauert etwa 30 Sekunden für die gleiche Anzahl von Objekten.

Darüber hinaus scheint es, um das mongoDB-Protokoll zu öffnen, etwa 8-10 Verbindungen mit der DB zu öffnen, um diese Abfrage durchzuführen.

Also, was ich tun möchte, ist die Abfrage der Datenbank für ein Array von primaryKeys und holen Sie sie alle auf einmal zurück, dann führen Sie das Parsen in einer Schleife danach mit einer Verbindung, wenn möglich.

Wie könnte ich meine Abfrage optimieren, um dies zu tun?
Danke,
--Michael

Antwort

2

Sie wollen in $ verwenden. $ oder wird auch funktionieren, ist aber ausführlicher und wird nur in neueren Versionen unterstützt (post 1.5.4 glaube ich).

2

es klingt wie für das, was Sie suchen die magische „$ in“ Anweisung in der Abfrage ist. Ich bin nicht mit C# aber in json vertraut, dann würden Sie bei einer Abfrage suchen ähnelt:

query = { 
    'primaryKey': { 
     '$in': [ 
     'val1', 
     'val2', 
     'val3' 
     ] 
    } 
} 

die oben wird eine Liste der Ergebnisse als Cursor zurück, wenn Aufruf .find(), im Gegensatz zu dem, was Sie tun jetzt, wo Sie einen einzigen primaryKey senden und findOne() aufrufen.

find() gibt einen Cursor zurück (im Gegensatz zu findOne(), der eine Datenstruktur zurückgibt). Um auf die Daten zuzugreifen, müssen Sie das Cursorobjekt durchlaufen, um jedes Dokument zu erfassen.

Hoffe, das hilft! Fühlen Sie sich frei, bestimmte Fragen in den Kommentaren zu stellen.

MongoDB $ oder Referenz: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

C# find() Referenz: http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

+0

Dies ist nicht ganz richtig wie $ oder enthält ein Array von Kriterien (Ausdrücke) nicht Werte. –

Verwandte Themen