16 votes

Comment obtenir une explication pour un compte MongoDB ?

Dans MongoDB, vous pouvez obtenir une explication sur la façon dont une requête a été exécutée, avec des informations intéressantes sur les performances :

> db.people.find({ 'items' : { '$gte' : 1 } }).explain()

Puis-je obtenir la même chose pour un "count" (qui n'est pas une requête, mais une commande) ?

> db.people.count({ 'items' : { '$gte' : 1 } })

22voto

marmor Points 4559

Mongo 3.0 a introduit une nouvelle façon d'expliquer les requêtes sans curseur :

db.my_collection.explain().count()

Voir : http://docs.mongodb.org/manual/reference/method/db.collection.explain/#db.collection.explain

10voto

inolasco Points 51

Sur la base de https://jira.mongodb.org/browse/SERVER-14098 Une nouvelle version future prendra en charge cette fonction dans le format :

db.runCommand({
    explain: {
        count: 'collectionName',
        query: {
            foo: 'bar'
        }
    }
})

3voto

Wes Freeman Points 17475

Je suis presque sûr que count(query) est l'abréviation de find(query).count()-en d'autres termes, l'explication est exactement la même. Il n'y a pas d'explication spécifique optimisation du comptage fait, sauf peut-être pour un comptage complet des collections. Par exemple, l'exécution d'un comptage sur un champ non indexé pour une plage prend exactement le même temps que l'exécution d'un find.explain avec la même plage.

J'ai écrit une fonction appelée timeCount qui prend la moyenne du temps de la fonction de comptage, puis affiche la sortie de l'explication pour comparaison.

function timeCount(coll, query) {
  var n = 5;
  var total = 0;
  for(var i = 0; i < n; i++) {
    var start = new Date();
    db[coll].find(query).count();
    var end = new Date();
    total += (end - start);
    print("time[" + i + "]: " + (end - start) + "ms");
  }
  print("average time: " + (total / n));

  var explain = db[coll].find(query).explain();
  print("explain (from find): ");
  for(e in explain) {
    if(typeof explain[e] == "string" || typeof explain[e] == "number") {
      print(e + ": " + explain[e]);
    }
  }
}

Le résultat ressemble à ceci :

> timeCount('test',{x:{$gt:5000}});
time[0]: 1339ms
time[1]: 1280ms
time[2]: 1347ms
time[3]: 1322ms
time[4]: 1299ms
average time: 1317.4
explain (from find): 
cursor: BtreeCursor x_1_y_1
nscanned: 995062
nscannedObjects: 995062
n: 995062
millis: 1390
nYields: 0
nChunkSkips: 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X