【问题标题】:sort a mongodb query based on a field in a subdocument in Go根据 Go 中子文档中的字段对 mongodb 查询进行排序
【发布时间】:2016-07-25 22:39:51
【问题描述】:

假设我有以下结构

type Test struct {
  Title  string `bson:"title" json:"title"`
  Update Update `bson:"update" json:"update"`
}

type Update struct {
  Changes    []string  `bson:"change" json:"change"`
  UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"`
}

假设我想通过“update.updatedAt”对查询中的结果进行排序

cs.Find(bson.M{title: "some title"}).Sort("-update.updatedAt").Limit(10).All(&results)

此查询未按预期工作。我似乎找不到任何有关如何按子文档字段对查询进行排序的文档。直觉上,我确信我的例子会奏效。作为参考,“-updatedAt”工作得很好,但出于不需要解释的原因,我必须将 Update 作为 Test 的子文档。

到目前为止,我看到的每个示例和堆栈溢出问题都涉及子文档或数组的排序和重新排序。在这种情况下,我不关心子文档的顺序,也不按数组内的任何内容进行排序。我只想按子文档的日期对文档进行排序。

有没有办法使用 Go Mgo 查询库来做到这一点?

【问题讨论】:

    标签: mongodb sorting go


    【解决方案1】:

    我很确定这与您的数据结构有关,因为下一个代码按预期工作(您可以在您的 PC 上测试它)

    package main
    
    import (
        "fmt"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
        "log"
        "time"
    )
    
    type Test struct {
        Title  string `bson:"title" json:"title"`
        Update Update `bson:"update" json:"update"`
    }
    
    type Update struct {
        Changes   []string  `bson:"change" json:"change"`
        UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"`
    }
    
    func main() {
        session, err := mgo.Dial("mongodb://souser:123456@ds055855.mlab.com:55855/catalog")
    
        if err != nil {
            panic(err)
        }
        defer session.Close()
        session.SetMode(mgo.Monotonic, true)
    
        c := session.DB("catalog").C("sortable")
    
        /*
            // Fill collection with test data (test collection aready has 15 elements)
            for i := 0; i < 15; i++ {
                c.Insert(&Test{
                    Title: "Title",
                    Update: Update{
                        Changes:   []string{fmt.Sprintf("Changes #%d", i)},
                        UpdatedAt: time.Now(),
                    },
                })
            }
        */
    
        var results []Test
    
        err = c.Find(bson.M{"title": "Title"}).Sort("-update.updatedAt").Limit(10).All(&results)
        if err != nil {
            log.Fatal(err)
        }
    
        for _, e := range results {
            fmt.Println(e.Update.UpdatedAt)
        }
    }
    

    【讨论】:

    • 你说得对。感谢您抽出宝贵时间整理。
    【解决方案2】:

    您需要传递以逗号(,)分隔的子文档字段,例如:

    cs.Find(bson.M{title: "some title"}).Sort("update","-updatedAt").Limit(10).All(&results)

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2021-10-22
      • 2020-10-17
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多