J'essaie d'exécuter une requête avec "sort" et "limit". Avec mgo vous pourriez faire Find(nil).Sort(“-when”).Limit(10)
mais le nouveau pilote mongo officiel n'a pas de telles méthodes. Comment trier et "limiter" avec le nouveau pilote?
Le pilote officiel n'est pas aussi simple que mgo
. Vous pouvez trier et limiter en utilisant le findopt.Limit
et findopt.Sort
.
Vous pouvez voir des exemples dans le référentiel officiel.
Dans la version actuelle mongo-go-driver v1.0. , les options sont simplifiées. Par exemple, pour effectuer une recherche, un tri et une limitation:
import (
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
options := options.Find()
// Sort by `_id` field descending
options.SetSort(bson.D{{"_id", -1}})
// Limit by 10 documents only
options.SetLimit(10)
cursor, err := collection.Find(context.Background(), bson.D{}, options)
Voir plus d'options disponibles sur godoc.org/go.mongodb.org/mongo-driver/mongo/options . Surtout FindOptions pour toutes les options possibles pour Find()
.
vous avez besoin d'importer le paquet "github.com/mongodb/mongo-go-driver/options" pour construire un findOptions
.
import github.com/mongodb/mongo-go-driver/options
findOptions := options.Find() // build a `findOptions`
findOptions.SetSort(map[string]int{"when": -1}) // reverse order by `when`
findOptions.SetSkip(0) // skip whatever you want, like `offset` clause in mysql
findOptions.SetLimit(10) // like `limit` clause in mysql
// apply findOptions
cur, err := collection.Find(context.TODO(), bson.D{}, findOptions)
// resolve err
for cur.Next(context.TODO()) {
// call cur.Decode()
}
Vous pouvez utiliser
findOptions := options.Find()
findOptions.SetLimit(2)
findOptions.SetSkip(2)
...
cursor, err := collection.Find(context.Background(), bson.M{}, findOptions)
ressource sur https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial
L'option de tri vous oblige apparemment à ajouter un map[string]interface{}
où vous pouvez spécifier un champ comme clé et un sortOrder comme valeur (où 1 signifie croissant et -1 signifie décroissant) comme suit:
sortMap := make(map[string]interface{})
sortMap["version"] = 1
opt := findopt.Sort(sortMap)
Pour autant que je puisse voir, cela signifie que vous ne pouvez trier correctement les résultats que sur un seul sortField car les clés d'une carte go sont stockées dans un ordre aléatoire.
OPTION UNE LIGNE
Je sais qu'il y a déjà beaucoup de réponses mais vous pouvez le faire en une seule ligne (si vous en avez besoin pour n'importe quel cas)
// From the Doc
// func (f *FindOptions) SetSort(sort interface{}) *FindOptions
cursor, err := collection.Find(context.Background(), bson.M{}, options.Find().SetSort(map[string]int{"when": -1}).SetLimit(10))
SetSort () et les autres retournent actuellement le pointeur parent lui-même