【问题标题】:Golang MongoDB Driver sortGolang MongoDB 驱动排序
【发布时间】:2020-02-02 00:18:17
【问题描述】:

如何使用golang mongodb驱动查询find?

我试试这个:

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

但是我收到了这个错误:

无法将类型字符串转换为 BSON 文档:WriteString 只能在定位在元素或值上但定位在 TopLevel 上时写入

我不知道将什么传递给 Sort 变量,因为它是一个接口{}。

【问题讨论】:

    标签: mongodb go


    【解决方案1】:

    试试下面的代码

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

    【讨论】:

      【解决方案2】:

      我无法将 ‍‍bson.D 传递给选项(导致错误)。 但这段代码对我有用:

          queryOptions := options.FindOneOptions{}
          
          queryOptions.SetSort(bson.D{{"priority", -1}, {"last_error_time", 1}})
      
          sResult := collection.FindOne(context.TODO(), queryFilter, &queryOptions)
      

      【讨论】:

      • bson.M 和 bson.D 非常相似,但在这种情况下,您必须使用 bson.D,因为它保持参数的顺序。您无法修复这样的错误:queryOptions.SetSort(bson.D{{Key: "priority", Value: -1}, {Key: "last_error_time", Value: 1}})
      • @Denis 非常感谢
      【解决方案3】:

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

      • 如果尝试按多个字段排序,请务必使用 bson.D 而不是 比 bson.M,因为 bson.M 不保留顺序。

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

      • 正如 dassum 所做的那样,将 bson.M{} 传递给
        推荐的空过滤器 mongo documentation

      应用:

      sort := bson.D{}
      for _, example := examples {
          sort = append(sort, bson.E{example, 1})
      }
      
      findOptions.SetSort(sort)
      db.Collection("products").Find(nil, bson.D{}, findOptions)
      

      【讨论】:

        猜你喜欢
        • 2023-01-27
        • 2021-02-09
        • 2014-09-14
        • 1970-01-01
        • 2021-05-19
        • 2022-01-16
        • 2016-03-13
        • 2020-12-20
        • 1970-01-01
        相关资源
        最近更新 更多