【问题标题】:How to sort in mongo based on a field but give preference to documents satisfying certain condition?如何根据字段在mongo中排序但优先考虑满足特定条件的文档?
【发布时间】:2016-01-19 22:06:42
【问题描述】:

我有一个 mongodb 集合,我使用 { $sort : { updated_at : -1 } } 根据他们的上次更新日期对其进行排序。 现在我正在尝试更新我的查询以仍然按updated_at 排序,但优先考虑那些满足特定条件的文档,例如字段的数组长度大于零,即{'img.0': { $exists: true }}

但是如何在排序查询中组合它呢?

我的要求是查询首先返回img长度大于0的所有文档,按updated_at排序,然后列出其余按updated_at排序的文档

谢谢

【问题讨论】:

    标签: mongodb sorting


    【解决方案1】:

    使用 aggregation framework,您的管道会在其中创建一个额外的字段,该字段包含一个代表上述条件的标志,您可以将其与 updated_at 字段一起用作您的排序选项:

    db.test.aggregate([
        {
            "$project": {
                "img": 1,
                "updated_at": 1,
                "other_fields": 1,
                "hasImages": {
                    "$cond": [
                        { 
                            "$ne": [ 
                                {
                                    "$size": { "$ifNull": [ "$img", [] ] }
                                }, 
                                0 
                            ]
                        },
                        1, 0
                    ]               
                }
            }
        },
        {
            "$sort": {
                "hasImages": -1, "updated_at": - 1
            }
        }
    ])
    

    查看下面的测试演示

    【讨论】:

    • 非常感谢。像魅力一样工作! :-)
    • @SurenderThakran 不用担心,很乐意提供帮助:)
    【解决方案2】:
    db.collection("collectionName").find({'img.0': { $exists: true }}).sort({ updated_at : -1 })
    

    db.collection.aggregate([
        { $match: {'img.0': { $exists: true }}},
        {$sort: {"updated_at" : -1}}
      ])
    

    【讨论】:

    • 这只会返回那些满足条件的文档并按updated_at排序。我想首先返回所有此类文档,但之后获取由 updated_at 排序的 REMAINING 文档
    • 你的意思是,你想对所有满足条件的文档进行排序,然后附加所有不满足查询的文档。对吗?
    • 是的。我只想优先考虑满足条件但同时显示其余文档的文档。
    猜你喜欢
    • 2021-07-13
    • 2011-12-21
    • 2019-04-23
    • 2023-03-13
    • 1970-01-01
    • 2017-02-19
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多