2010-08-23 4 views
4

Je viens de commencer à utiliser mongoDb comme backend pour PHP. J'utilise simplement find() query pour l'un de mes besoins. Je veux seulement les 100 premiers résultats, mais je veux aussi obtenir le total des résultats disponibles. J'essaie ça.Curseur Erreur de délai sur le curseur MongoDb

$cursor = $this->dbReference->dbName->find($query); 
    if($count != 0) 
    { 
      $cursor->skip($startIndex); 
      $cursor->limit($count); 
    } 
    $totalCount = $cursor->count(); 

    $entries = array(); 
    while ($cursor->hasNext()) 
    { 
      $cursor->next(); 
      $entry = $cursor->current(); 
      array_push($entries , $entry); 
    } 

Le problème est maintenant .. T son résultat de recherche contient exactement plus de 50K résultats. Mais je ne récupère que 100 à la fois. J'utilise $ cursor-> count() pour obtenir le nombre total de lignes de résultats disponibles. sur cette erreur de ligne indique que "Cursor a expiré". S'il vous plaît, quelqu'un peut-il me suggérer quel est le problème? ou quelle est l'alternative pour trouver le nombre total de résultats de recherche.

Merci d'avance.

+0

La nouvelle version de mongodb résout ce problème, Et fonctionne bien avec laravel et nodejs –

Répondre

1

Je viens de l'essayer avec 100 000 documents simples. $totalCount pour moi est toujours 100000, peu importe si $count et $startIndex sont définies (c'est le comportement correct). $entries contient tous les 100000 entrées. L'opération entière prend environ 3 secondes sur ma configuration locale.

Utilisez-vous une base de données distante? Il est possible que le réseau soit à l'origine du délai d'expiration plutôt que de MongoDB.

De quelle taille sont vos documents? Le volume de données peut affecter la vitesse.

+0

@danielwood Oui, j'utilise la base de données distante, mais c'est aussi sur le réseau local (Intranet). Peut-être que ce problème sera dû à $ cursor-> count(); Et aussi $ cursor-> count() augmente le temps d'exécution. Si je n'utilise pas $ cursor-> count() Il fonctionne rapidement comme vous l'avez dit. –

7

Vous pouvez résoudre le temps du curseur sur problème en ajoutant ce code avant find():

MongoCursor::$timeout = -1; 
$cursor = $this->dbReference->dbName->find($query); 
+0

La propriété statique 'MongoCursor :: $ timeout' est obsolète – Mohammad

0

J'ai découvert que le -> count() souffle également le temps d'exécution jusqu'à ce qu'il arrive à expiration. Ce qui est mieux pour moi est d'utiliser simplement find(), puis placez l'élément désiré dans le curseur dans un tableau en utilisant une boucle foreach. Ensuite, faites un array_count_values ​​() sur ce tableau. Semble être un peu plus rapide aussi.

Merci pour le MongoCursor :: $ timeout = -1 car je pense que cela m'a vraiment aidé dans ma situation.

Magiquement, il n'y a plus de messages de timeout horribles.