代码之家  ›  专栏  ›  技术社区  ›  mike

如何在MongoDB中“排序”和“限制”结果?

  •  4
  • mike  · 技术社区  · 6 年前

    我试图用“sort”和“limit”执行一个查询。用 mgo 你可以做到 Find(nil).Sort(“-when”).Limit(10) 但是 new, official mongo driver 没有这样的方法。我该如何对新司机进行分类和“限制”?

    5 回复  |  直到 6 年前
        1
  •  4
  •   Marco Talento    6 年前

    官方司机并不直截了当 mgo . 您可以使用 findopt.Limit findopt.Sort .

    您可以从官方存储库中看到示例。

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

        2
  •  6
  •   Wan B.    5 年前

    在当前版本中 mongo-go-driver v1.0.3 ,选项将被简化。例如,要执行查找、排序和限制:

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

        3
  •  3
  •   sieberts    6 年前

    排序选项显然要求您添加 map[string]interface{} 其中,可以将字段指定为键,将sortorder指定为值(其中1表示升序,-1表示降序),如下所示:

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

    据我所见,这意味着您只能按一个sortfield对结果进行正确排序,因为go映射中的键是以随机顺序存储的。

        4
  •  2
  •   Mendo    5 年前

    你可以使用

    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

        5
  •  1
  •   jianyongli    5 年前

    您需要导入“github.com/mongodb/mongo go driver/options”包来构建 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()
    }