【问题标题】:MongoDB: Sort by field existing and then alphabeticallyMongoDB:按现有字段排序,然后按字母顺序
【发布时间】:2015-09-20 15:03:27
【问题描述】:

在我的数据库中,我有一个 name 字段。在某些记录中它是一个空字符串,在其他记录中它包含一个名称。

在我的查询中,我目前正在做:

db.users.find({}).sort({'name': 1})

但是,这会首先返回名称字段为空的结果,然后按字母顺序返回结果。正如预期的那样,执行.sort({'name': -1}) 会返回带有名称的结果,然后返回带有空字符串的结果,但它是按字母倒序排列的。

有没有一种优雅的方式来实现这种排序?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    怎么样:

    db.users.find({ "name": { "$exists": true } }).sort({'name': 1})
    

    因为毕竟当您要排序的字段实际上不存在时,返回值是null,因此顺序“低于”任何肯定结果。因此,如果您真的只是在寻找具有匹配值的内容,则排除这些结果是有意义的。

    如果你真的想要那里的所有结果并且不管null的内容,那么我建议你通过.aggregate()“加权”它们:

    db.users.aggregate([
         { "$project": {
             "name": 1,
             "score": {
                 "$cond": [
                     { "$ifNull": [ "$name", false ] },
                     1,
                     10
                 ]
             }
         }},
         { "$sort": { "score": 1, "name": 1 } }
    ])
    

    这会将所有null 结果通过分配一个值移动到“链的末端”。

    【讨论】:

    • 最后我决定回到我的数据库创建脚本并在创建每个文档时添加一个手动“评分”(让我可以更好地控制不同的参数),但这个解决方案也很有效。
    【解决方案2】:

    如果您想过滤掉带有空 "name" 字段的文档,请更改您的查询:db.users.find({"name": {"$ne": ""}}).sort({"name": 1})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多