mongodb - 根据 Go 子文档中的字段对 mongodb 查询进行排序

标签 mongodb sorting go

假设我有以下结构

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 的子文档。

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

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

最佳答案

我很确定这与您的数据结构有关,因为接下来的代码会按预期工作(您可以在您的 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)
    }
}

关于mongodb - 根据 Go 子文档中的字段对 mongodb 查询进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36435683/

相关文章:

java - 在 java 中对具有特定 JSON 的嵌入式文档使用 $addToSet 和 upsert

ios - uniqueUnionOfObjects更改数组的顺序

java - Java中的字符串数组排序

c# - 如何在 C# 中保持内部顺序的同时将 2 个排序列表合并到一个随机列表中

go - 尝试向已关闭的 channel 插入值时避免 panic

go - 中间件执行流程

testing - 如何衡量 Golang 集成测试覆盖率?

node.js - mongodb 中填充的替代方案?

javascript - 如何查找与查询中具有完全相同数组条目的文档

javascript - meteor 中的多个数据库保持 react 性