【问题标题】:Sort mongo results if a value exists in the field or not如果字段中存在值,则对 mongo 结果进行排序
【发布时间】:2023-01-19 02:17:20
【问题描述】:

我有一个 Student 结构,看起来像这样。

type Student struct {
    Name            string                         `json:"name" bson:"name"`
    Marks           int                            `json:"marks" bson:"marks"`
    Subjects        []string                       `json:"subjects" bson:"subjects"`
}

我正在使用 opts.SortSort 结果。更多关于那个

opts.Sort = bson.D{
    {Key: "marks", Value: -1},
}

我还想按 Subjects 对结果进行排序,如果对于任何学生,如果主题 Math 存在,则应将其排在最前面(降序),然后按 marks 对其进行排序 我试过这样做

opts.Sort = bson.D{
    {Key: "subjects", Value: bson.M{"$in": "math"}},
    {Key: "marks", Value: -1},
}

我知道这看起来不对,因为我没有传递 1 或 -1,但我不知道如何修改它才能使其工作。 我在这里错过了什么?

【问题讨论】:

    标签: mongodb go mongodb-query


    【解决方案1】:

    您不能通过单个查询执行此操作。

    查询按 marks 排序的记录,并通过将主题为 "math" 的文档移到前面,在 Go 中进行第二次排序。

    如果您只需要在 MongoDB 中执行此操作,则必须重新设计:例如您可以向存储学生是否拥有"math" 的信息的文档添加一个布尔字段,这样您就可以轻松地将其包含在排序中。

    但是请注意,您可以使用Aggregation framework 执行此操作。这是可以满足您需要的查询:

    db.students.aggregate(
        {$addFields:{"hasMath": {$in:["math", "$subjects"]}}},
        {$sort:{hasMath: -1, marks: -1}}
    )
    

    这基本上是我建议的:它添加一个 hasMath 字段,告诉学生在 subjects 数组中是否有 "math",然后首先按 hasMath 降序排列文档,然后按标记降序排列文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多