【问题标题】:How to perform a value based Order By in MongoDB?如何在 MongoDB 中执行基于值的 Order By?
【发布时间】:2015-11-19 22:52:33
【问题描述】:
select * from users ORDER BY FIELD(status, 'A', 'B', 'C', 'D') ASC; 

这将根据用户的状态对所有用户进行排序,所有状态为“A”的用户将首先出现,然后是“B”,依此类推。 MongoDB 中的等价物是什么?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您需要为每个值在 MongoDB 术语中按顺序为 $project 一个“权重”,这意味着 .aggregate() 方法:

    db.users.aggregate([
        { "$project": {
            "status": 1,
            "a_field": 1,
            "another_field": 1,
            "pretty_much_every_field": 1,
            "weight": {
                "$cond": [
                    { "$eq": [ "$status", "A" ] },
                    10,
                    { "$cond": [ 
                        { "$eq": [ "$status", "B" ] },
                        8,
                        { "$cond": [
                            { "$eq": [ "$status", "C" ] },
                            6,
                            { "$cond": [
                                { "$eq": [ "$status", "D" ] },
                                4,
                                0
                            ]}
                        ]}
                    ]}
                ] 
            }
        }},
        { "$sort": { "weight": -1 } }
    ])
    

    ternary$cond 的嵌套使用允许将“状态”的每个项目视为按给定参数顺序排列的“权重”值。

    这又被馈送到$sort,其中投影值(“权重”)用于根据加权匹配对结果进行排序。

    因此,通过这种方式,优先考虑“状态”匹配的顺序,即首先出现在排序结果中。

    【讨论】:

      【解决方案2】:

      排序 ASC -> 状态:1

      db.users.find().sort( { status: 1 } )
      

      对 DESC 进行排序 -> 状态:-1

      db.users.find().sort( { status: -1 } )
      

      【讨论】:

      • 这是一个简单的排序。我将如何根据值进行排序。所以- status, 'C', 'A', 'B', 'D' - 这将首先返回状态为'C'的用户,然后是'A'等等。
      • 你想发送一个带有(按你想要的)状态作为参数的数组吗?
      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多