Golang MongoDB 驱动程序排序。

15

如何使用Golang MongoDB驱动程序查询数据?

我尝试了以下代码:

db.Collection("products").Find(nil, bson.M{}, &options.FindOptions{Sort: "-price"})

但是我遇到了这个错误:

无法将字符串转换为BSON文档:WriteString只能在定位于元素或值的情况下编写,但是定位于顶级

我不知道该向Sort变量传递什么,因为它是一个interface {}。

5个回答

36

尝试下面的代码

findOptions := options.Find()
// Sort by `price` field descending
findOptions.SetSort(bson.D{{"price", -1}})


db.Collection("products").Find(nil, bson.D{}, findOptions)

7

我无法将 bson.D 传递给 options(这会导致错误), 但是下面的代码对我有效:

    queryOptions := options.FindOneOptions{}
    
    queryOptions.SetSort(bson.D{{"priority", -1}, {"last_error_time", 1}})

    sResult := collection.FindOne(context.TODO(), queryFilter, &queryOptions)

1
bson.M和bson.D非常相似,但在这种情况下,您必须使用bson.D,因为它维护参数的顺序。您不能像这样修复错误:queryOptions.SetSort(bson.D{{Key: "priority", Value: -1}, {Key: "last_error_time", Value: 1}}) - Denis
@Denis 非常感谢 - Amin Shojaei

3

在尝试解决相关问题时,我遇到了一些注意事项:

  • 如果要按多个字段进行排序,请确保使用bson.D而不是bson.M,因为bson.M不会保留顺序。

  • 如果要编程构建多个排序字段,请尝试将bson.E附加到bson.D中。

  • 与dassum一样,按照mongo文档的建议,将bson.M{}传递为空过滤器。

应用:

sort := bson.D{}
for _, example := examples {
    sort = append(sort, bson.E{example, 1})
}

findOptions.SetSort(sort)
db.Collection("products").Find(nil, bson.D{}, findOptions)

0

另外需要注意的一点是,确保字段名称的映射正确。在我的情况下,我尝试对一个名为createdAt的字段进行排序,但后来发现我的mongodb字段被映射为createdat

queryOptions.SetSort(bson.D{{"createdat", -1}

0
尝试这个方法
findOptions := options.Find()
// Sort by `price` field descending
findOptions.SetSort(bson.M{"price": -1})


db.Collection("products").Find(nil, bson.D{}, findOptions)

这帮助我修复了我的代码。这个问题是由于你使用的Go版本引起的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接