2011-01-11 5 views
2

J'ai une application qui interroge les données d'un MongoDB en utilisant le pilote MongoDB C# quelque chose comme ceci:Comment récupérer des documents par lots avec mongoDB?

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); 
} 

Sur ma machine locale (développement) pour obtenir 100 objets de cette façon prend moins d'une seconde. Cependant, j'ai récemment déplacé la base de données à un serveur sur Internet, et cette requête prend environ 30 secondes à exécuter pour le même nombre d'objet.

En outre, en regardant le journal mongoDB, il semble ouvrir environ 8-10 connexions à la base de données pour effectuer cette requête. Donc, ce que je voudrais faire est d'avoir la requête de la base de données pour un tableau de primaryKeys et de les récupérer tous en même temps, puis faire l'analyse dans une boucle après, en utilisant une connexion si possible.

Comment puis-je optimiser ma requête pour ce faire?
Merci,
--Michael

Répondre

2

Vous voulez utiliser $ dans. $ ou fonctionnera aussi bien, mais est plus verbeux et seulement supporté dans les nouvelles versions (post 1.5.4 je crois).

2

cela ressemble à ce que vous cherchez est magique « $ dans » déclaration dans votre requête. Je ne suis pas familier avec le C# mais JSON, vous seriez à la recherche à une requête similaire à:

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

Le plus va retourner une liste de résultats en tant que curseur lors de l'appel .Find(), contrairement à ce que vous le faites maintenant où vous soumettez une primaryKey unique et appelez findOne(). Find() renvoie un curseur (contrairement à findOne() qui renvoie une structure de données) afin d'accéder aux données, vous devrez parcourir l'objet curseur pour saisir chaque document.

Espérons que cela aide! N'hésitez pas à poser des questions plus spécifiques dans les commentaires.

$ MongoDB ou référence: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

trouver C#() Référence: http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

+0

Ce n'est pas tout à fait exact $ ou contient un tableau de critères (expressions) et non de valeurs. –

Questions connexes