2013-09-05 5 views
0

j'ai fais cette requête sur db avec 3.000.000 de l'enregistrement et la taille de 3Go:DB Mongo Chercher avec orderby

int toskip=5000; 
int limit=100; 
MongoClient mongoClient = new MongoClient("localhost" , 27017); 
DB db = mongoClient.getDB("mydb"); 
DBCollection collection = db.getCollection("mycollection"); 
BasicDBObject query = new BasicDBObject("idfile",idfile); 
BasicDBObject orderBy = new BasicDBObject("idrow",1); 
List<DBObject> listElem = collection.find(query).sort(orderBy).skip(toskip).limit(limit).toArray(); 
mongoClient.close(); 

mais ne fonctionne pas, car à court de mémoire. Est-ce que ma requête est correcte? Merci.

+0

Que voulez-vous dire qu'il n'y a plus de membre? Que fait? Si MongoDB alors vous avez besoin d'un index sur ce champ – Sammaye

+0

On dirait que vous avez oublié de définir 'limit' et' toskip'. –

+0

J'ai inséré un index sur 'idfile' et un second index sur 'idrow', Sammaye j'ai saturé mon ram pour traiter cette requête. – Doom

Répondre

1

Vous devez définir un index pour accélérer les choses. Il y a 4 possiblités.

Si vous avez un support d'index pour la requête, un index sur idfile accélérera la partie de requête mais ne supportera pas le tri après, donc vous devrez faire face à un tri lent si la requête a un grand resultset. (Exactement comme Sammaye l'a mentionné). De ce fait, l'index est "petit", cela peut être un bon moyen.

Si vous avez un index pour la phase de tri, vous allez exécuter un scan complet sur la collection, ce qui vaut probablement toujours le premier cas. Avoir un index composé sur (vérifiez le documentation) {idfile: 1, idrow: 1} vous aidera, jusqu'à ce que vous n'ayez pas pu lancer une requête basée sur une plage ou quelque chose comme ça. Lorsque vous interrogez uniquement pour une seule paire de valeurs de champ unique, cela fonctionnera et accélérera à la fois la requête et le tri.

Si vous êtes susceptible d'exécuter une requête qui obtient plusieurs valeurs pour le fichier ID, il est recommandé de créer un index composé tel que {idrow: 1, idfile: 1}. La phase de tri sera prise en charge par la structure l'index et beaucoup de documents seront exclus pour la numérisation. Juste quelque chose à tester.

+0

Merci, maintenant j'ai beaucoup plus clair le problème. – Doom