web-dev-qa-db-fra.com

Comment "trier" et "limiter" les résultats dans mongodb?

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?

8
mike

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.

https://github.com/mongodb/mongo-go-driver/blob/5fea1444e52844a15513c0d9490327b2bd89ed7c/mongo/crud_spec_test.go#L364

5
Marco Talento

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().

10
Wan Bachtiar

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()
}

4
jianyongli

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

3
Mendo

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.

3
sieberts

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

0
Emixam23