「sort」と「limit」でクエリを実行しようとしています。 mgo を使用するとFind(nil).Sort(“-when”).Limit(10)
を実行できますが、- new、official mongo driver にはそのようなメソッドはありません。新しいドライバーで並べ替えて「制限」するにはどうすればよいですか?
公式ドライバはmgo
のように単純ではありません。 findopt.Limit
とfindopt.Sort
を使用して、並べ替えと制限を行うことができます。
公式リポジトリから例を見ることができます。
現在のバージョン mongo-go-driver v1.0. では、オプションが簡略化されています。たとえば、検索、並べ替え、制限を実行するには:
_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)
_
godoc.org/go.mongodb.org/mongo-driver/mongo/options で利用可能なその他のオプションを参照してください。特に FindOptions は、Find()
のすべての可能なオプションについてです。
findOptions
をビルドするには、「github.com/mongodb/mongo-go-driver/options」パッケージをインポートする必要があります。
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()
}
使用できます
findOptions := options.Find()
findOptions.SetLimit(2)
findOptions.SetSkip(2)
...
cursor, err := collection.Find(context.Background(), bson.M{}, findOptions)
https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial のリソース
Sort-optionでは、次のようにmap[string]interface{}
を追加する必要があります。ここでは、フィールドをキーとして、sortOrderを値として指定できます(1は昇順、-1は降順を意味します)。
sortMap := make(map[string]interface{})
sortMap["version"] = 1
opt := findopt.Sort(sortMap)
私の知る限り、これは、goマップのキーがランダムな順序で格納されているため、結果を1つのsortFieldでしか正しくソートできないことを意味します。
ワンラインオプション
私はすでにたくさんの答えがあることを知っていますが、あなたはそれを1行で行うことができます(あなたがあなたのどんな場合でもそれを必要とする場合)
// 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()およびその他は現在、親ポインタ自体を返します