mongo sorte après que la limite après tri - ne fonctionne Pas
J'ai une collection, à partir de laquelle je reçois type particulier d'utilisateurs à l'aide de $query
Puis j'ai besoin de les trier en fonction de user_id croissant et de les limiter à 2000
De ces j'ai besoin d'un max user_id, donc je les trier dans l'ordre décroissant, et la limite à 1.
Mais cette seconde sorte oublie la limite de 2000 et sortes de cours sur l'ensemble du curseur de find().
Travail autour?
$cursor = $collection ->find($query) //too many entries
->sort(array('user_id'=>1)) //go ascending
->limit(2000) //got our limited qouta
->sort(array('user_id'=>-1)) //go descending to get max
->limit(1); //the one with max(user_id)
Vous avez un point-virgule sur la troisième ligne. C'est qu'un copier/coller de l'erreur ou est-il aussi présent dans votre code d'origine?
oh oui, copier-coller d'erreur, merci de remarquer, corrigé
oh oui, copier-coller d'erreur, merci de remarquer, corrigé
OriginalL'auteur davneet | 2013-01-20
Vous devez vous connecter pour publier un commentaire.
Votre ne peut pas faire un tri et donc une limite, puis un tri. Le Curseur de l'objet, c'est exactement cela et il ne sera pas exécuté la requête jusqu'à ce que vous parcourez pour le premier résultat via
getNext()
qui est soit de les exécuter manuellement ou à l'intérieur d'unforeach
boucle non seulement cela, maissort
est juste une propriété de l'objet en tant que tel qui fait deux sortes juste remplace la propriété.La meilleure façon d'obtenir ce que vous cherchez est:
Qui prendra toujours le plus haut
user_id
(qui se produit à la fin dans ce genre) du groupe, qui va donner le même résultat que de faire deux sortes.nous pouvons faire $collection->find()->type()->skip(1999)->getNext(); la limite de(1) entre les deux peut être certainement sauté
Oui je n'avais pas pensé à ça, getNext() bien sûr, on se fait tout simplement le document suivant la limite est inerte.
OriginalL'auteur Sammaye
Comment au sujet de l'utilisation de skip():
limit(1)
ici, le travail tout aussi bien car seule la première de la documentation après l'1999 ignorée, est-il nécessaire?le code ci-dessus me donne encore des enregistrements de 2000 dans le curseur... cela voudrait dire malade à la parcourir plus de tous ceux arriver à la dernière record
ups, désolé. trouver des(...)->tri(...)->skip(1999)->limite de(1) est probablement ce que vous avez besoin.
OriginalL'auteur StefanMK
Quelle est la raison derrière tri-limit-tri-limite approche?
Ne peut pas juste faire
EDIT: Aussi, seul le dernier
sort
appliquée pour le curseur a un effet. (Cette ligne est présente danspymongo
docs ici, qui fait sens.)Ok, je comprends maintenant. Vous essayez d'avoir le 2000ème document ASC ordre qui correspond à la requête. Vous devez savoir que lorsque vous appliquez
sort
sur uncursor
. Aucun document sont extraites (donc trié) jusqu'à ce que vous avez réellement effectuer une itération sur ce curseur. Vous pouvez utiliserskip
mais qui devient une opération lente. La meilleure approche consiste à utiliser basé sur des requêtes dans des situations de ce genre.OriginalL'auteur Eren Güven
Je suis en utilisant le code suivant dans php5 et mongodb dernière version:
Il s'arrête de fonctionner lorsque j'utilise
->skip(1999)->limit(1)
aprèssort()
Le curseur
$doc
me donne des valeurs . J'ai essayé de freinage en ceci:Qui ont travaillé. Peut-être vous devriez essayer dans de nouvelles versions.
OriginalL'auteur Sak90
Réponse par Sammaye est correct.
Vous pouvez toujours obtenir comme vous le souhaitez. Vous pouvez utiliser l'agrégation de cadre, comme elle exécute une étape après l'autre étape et ainsi de suite.
OriginalL'auteur Somnath Muluk