web-dev-qa-db-ja.com

結果を「ソート」および「制限」する方法はmongodbになりますか?

「sort」と「limit」でクエリを実行しようとしています。 mgo を使用するとFind(nil).Sort(“-when”).Limit(10)を実行できますが、- new、official mongo driver にはそのようなメソッドはありません。新しいドライバーで並べ替えて「制限」するにはどうすればよいですか?

8
mike

公式ドライバはmgoのように単純ではありません。 findopt.Limitfindopt.Sortを使用して、並べ替えと制限を行うことができます。

公式リポジトリから例を見ることができます。

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

5
Marco Talento

現在のバージョン 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()のすべての可能なオプションについてです。

10
Wan Bachtiar

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

4
jianyongli

使用できます

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 のリソース

3
Mendo

Sort-optionでは、次のようにmap[string]interface{}を追加する必要があります。ここでは、フィールドをキーとして、sortOrderを値として指定できます(1は昇順、-1は降順を意味します)。

sortMap := make(map[string]interface{})
sortMap["version"] = 1
opt := findopt.Sort(sortMap)

私の知る限り、これは、goマップのキーがランダムな順序で格納されているため、結果を1つのsortFieldでしか正しくソートできないことを意味します。

3
sieberts

ワンラインオプション

私はすでにたくさんの答えがあることを知っていますが、あなたはそれを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()およびその他は現在、親ポインタ自体を返します

0
Emixam23