【问题标题】:Sort documents by whether a field is greater than 0?按字段是否大于 0 对文档进行排序?
【发布时间】:2015-12-22 09:01:40
【问题描述】:

假设我有一个包含如下文档的集合:

{
  title: 'test2',
  count: 0
},
{  
  title: 'test1,
  count: 2
},
{
  title: 'test3',
  count: 3
}

我希望它们按以下顺序显示:

  • 首先显示按标题排序的计数 > 0 的所有文档。
  • 然后显示所有具有计数 == = 按标题排序的文档。

意思是上面的数据应该显示:title1, title3, title2

所以基本上按{count > 0}: 1, title: 1排序

我从这个开始:

db.documents.find().sort({count: 1, title: 1})

但是这是按计数排序,而不是按计数是否大于0排序。

有没有办法做到这一点?

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    一个技巧是使用两个助手。

    helperName: function() {
        return Somethings.find({count:{$gte:1}}, {sort: {title: //something})
    }
    helperNameTwo: function() {
        return Somethings.find({count:0}}, {sort: {title: //something})
    }
    

    【讨论】:

    • 嗯,我也想要计数为 0 的文档。这不会排除它们吗?
    • 不确定我是否清楚地理解了您的问题。所以你想显示所有文档,但最高计数应该在顶部/底部?
    • 所有文件都应包括在内。任何数量的文档都应按标题排序在顶部。计数为零的文档应低于按标题排序的文档。我在我的问题中举了一个可能有帮助的例子。
    • @AbeMiessler 我明白了。你会按字母顺序排列标题吗?我知道 0 应该在底部
    • @AbeMiessler 用技巧编辑了我的问题。如果您使用它,您只需要根据需要对标题进行排序。
    【解决方案2】:

    使用find() 语句是不可能的,但您可以将其聚合如下:

    • $project 一个用于排序结果的字段-sort_field,如果count 的值是0,如果Infinity,给它一个权重,这样它就会出现在结束。

    • $sort 基于投影字段。

    示例代码:

    db.document.aggregate([
    {$project:{"title":1,
               "count":1,
               "sort_field":{$cond:[{$eq:["$count",0]},Infinity,"$count"]}}},
    {$sort:{"sort_field":1,"title":1}},
    {$project:{"count":1,"title":1}}
    ])
    

    测试数据:

    db.document.insert([
    {
      "title":"test2",
      "count": 0
    },
    {  
      "title":"test1",
      "count": 2
    },
    {
      "title":"test3",
      "count": 3
    }
    ])
    

    测试结果:

    {
            "_id" : ObjectId("567887f8b506fc2193a2269b"),
            "title" : "test1",
            "count" : 2
    }
    {
            "_id" : ObjectId("567887f8b506fc2193a2269c"),
            "title" : "test3",
            "count" : 3
    }
    {
            "_id" : ObjectId("567887f8b506fc2193a2269a"),
            "title" : "test2",
            "count" : 0
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 2018-11-07
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2017-11-13
      相关资源
      最近更新 更多