MongoDB différence entre $orderby et de Tri
Je veux extraire le document le plus récent, qui n'est évidemment qu'un seul document, ainsi findOne
devrait fonctionner correctement. Mais findOne
ici renvoie le premier document inséré. J'ai donc deux options maintenant utiliser $orderBy
avec findOne
ou de l'utilisation .sort()
fonction avec .limit()
dans find()
À l'aide de $orderBy il ressemblerait à quelque chose comme:
db.collection.findOne({$query:{},$orderby:{_id:-1}})
Et à l'aide de tri:
db.collection.find().sort({_id:-1}).limit(1).pretty()
Les deux fonctionnent très bien, je voulais juste savoir quelle requête doit je préfère ici? En termes de performance, ou les deux d'entre eux fonctionnent de la même manière à l'interne et il n'y a pas de différence entre les deux.
OriginalL'auteur Sambhav Sharma | 2014-07-31
Vous devez vous connecter pour publier un commentaire.
Ils sont le même et en fait la page de documentation pour
$orderby
réellement parle principalement sur l'sort()
fonction fournie.Ces requête modificateurs qui vous permettent d'ajouter des sections d'une requête sans l'aide de la fonctionnelle accesseurs existent, mais il y a un bug de mélanger ces deux ensemble, donc je vous recommande de choisir soit la requête des modificateurs ou de la fonctionnelle de méthodes et de s'en tenir à cette option.
En tentant de fournir un exemple de code que j'ai aussi découvert une autre chose, quand j'ai vu votre question. Vous fournir:
Mais il est bon de noter que:
Produit:
et comme vous pouvez le voir ici par mon jeu de données de test:
la réponse est correcte:
Il est donc intéressant de noter que la requête modificateurs sont pris en charge par
findOne
où fonctionnelle accesseurs sont pas, ce qui pourrait être une raison pour utiliser la requête des modificateurs de la place.find
prend en charge.sort
toutfindOne
n'est quefind
retourne un curseur de l'objet, qui a une.sort
méthode définie sur ce qui détermine l'ordre dans lequel les documents sont retournés (et qui ne peut être réglé avant le curseur a commencé à retourner lots de documents).findOne
renvoie zéro ou l'un des documents. document de revient est déterminé par l'oms est d'abord en fonction des$orderBy
si elle est définie. Sinon, c'est naturel, qui est l'ordre des documents sur le disque.en effet j'ai oublié de mentionner que findOne ne'tm retourner un curseur merci
OriginalL'auteur Sammaye
De Mongo 3.2,
$orderby
est obsolète.La docs explicitement dire:
Malheureusement,
findOne()
ne prend pas en charge lasort()
méthode, de sorte que vous aurez besoin pour passer enfind()
:Cela renvoie un
cursor
, vous aurez alors besoin de tirer sur le premier résultat à partir du curseur.sort()
méthode au lieu de le obsolète$orderby
, vous pouvez appeler.next()
sur le curseur à la fin de cette chaîne. Le plein équivalent de:db.collection.findOne({$query: {}, $orderby: {_id: -1}})
compatible avec Mongo 3.2:db.collection.find({}).sort({_id: -1}).limit(1).next()
Si le tableau de résultats est nécessaire - il suffit d'ajouter
.toArray()
, comme ceci:db.collection.find({}).sort({'key': -1}).limit(1).toArray()
OriginalL'auteur Jeff Widman