MongoDb:如何对日期字段进行汇总,分组和排序?

马可斯

在我的MongoDB人员集合中,我需要过滤具有相同“别名”属性值的人员,保留其中第一个,并为所有人员保留空的“别名”。

数据是这样的:

{ "_id" : "1", "flag" : true,  "name" : "Alice",    "alias" : null, "dateOfBirth": new ISODate('1995-12-27T00:00:00.000Z') },
{ "_id" : "2", "flag" : true,  "name" : "Bob",      "alias" : "4c", "dateOfBirth": new ISODate('1996-12-27T00:00:00.000Z') },
{ "_id" : "3", "flag" : true,  "name" : "Bobby",    "alias" : "4c", "dateOfBirth": new ISODate('1997-12-27T00:00:00.000Z') },
{ "_id" : "4", "flag" : true,  "name" : "Cristina", "alias" : null, "dateOfBirth": new ISODate('1998-12-27T00:00:00.000Z') },
{ "_id" : "5", "flag" : false, "name" : "Diego",    "alias" : null, "dateOfBirth": new ISODate('1999-12-27T00:00:00.000Z') },
{ "_id" : "6", "flag" : true,  "name" : "Zoe",      "alias" : "22", "dateOfBirth": new ISODate('2000-12-27T00:00:00.000Z') }

这是我的查询:

db.people.aggregate([ 
    { '$match': { 'flag': true } }, 
    { '$project': {
        'name': 1,          
        'alias': { 
            '$cond': [
                { '$eq': [ '$alias', null ] }, 
                '$_id', 
                '$alias' 
            ]
        }
    }},
    { '$group': {
        '_id': '$alias',         
        'name':  { '$first': '$name' },          
        'id': { '$first': '$_id' }       
    }}, 
    { '$project': {
        'alias': {
            '$cond': [ 
                { '$eq': [ '$id', '$_id' ] }, 
                null, 
               '$_id' 
            ]
        }, 
        'name': 1,
        '_id': '$id'
    }}
])

哪个返回:

{ "_id" : "6", "name" : "Zoe",      "alias" : "22" }
{ "_id" : "4", "name" : "Cristina", "alias" : null }
{ "_id" : "2", "name" : "Bob",      "alias" : "4c" }
{ "_id" : "1", "name" : "Alice",    "alias" : null }

到目前为止,一切都很好。

更新:至此,问题类似于建议的重复问题现在是不同的部分:

我需要根据“ dateOfBirth”字段对其进行排序。
非常有信心,我将查询更改为:

db.people.aggregate([ 
    { '$match': { 'flag': true } }, 
    { '$project': {
        'name': 1,          
        'dateOfBirth': 1,
        'alias': { 
            '$cond': [
                { '$eq': [ '$alias', null ] }, 
                '$_id', 
                '$alias' 
            ]
        }
    }},
    { '$group': {
        '_id': '$alias',         
        'name':  { '$first': '$name' },          
        'dateOfBirth': { '$first': '$dateOfBirth' },
        'id': { '$first': '$_id' }       
    }}, 
    { '$project': {
        'alias': {
            '$cond': [ 
                { '$eq': [ '$id', '$_id' ] }, 
                null, 
               '$_id' 
            ]
        }, 
        'name': 1,
        '_id': '$id',
        'dateOfBirth': 1,
    }},
    { '$sort': { 'dateOfBirth': 1 }}
])

但这给出了:

{ "_id" : "1", "name" : "Alice",    "dateOfBirth" : ISODate("1995-12-27T00:00:00Z"), "alias" : null }
{ "_id" : "6", "name" : "Zoe",      "dateOfBirth" : null, "alias" : "22" }
{ "_id" : "4", "name" : "Cristina", "dateOfBirth" : null, "alias" : null }
{ "_id" : "2", "name" : "Bob",      "dateOfBirth" : null, "alias" : "4c" }

当然,这是错的:dateOfBirth领域没有通过$group舞台...

关于如何通过的任何线索?

布雷克七

实际上,这对我来说很好,并且我怀疑您正在运行的实际代码中有错别字(不是该清单),而在某处缺少了“ dateOfBirth”(或可能拼写错误)。

但是,如果这里要吸取教训,那就应该不要分头$project$group分阶段,因为引入另一个管道阶段不仅效率低下(这意味着额外的数据传递),而且在指定要包含的数据时通常会造成混淆在管线中。

所以宁愿:

db.people.aggregate([
    { "$match": { "flag": true } },
    { "$group": {
        "_id": {
            "$ifNull": [ "$alias", "$_id" ]
        },
        "name": { "$first": "$name" },
        "dateOfBirth": { "$first": "$dateOfBirth" },
        "id": { "$first": "$_id" }
    }},
    { "$project": {
        "_id": "$id",
        "name": 1,
        "dateOfBirth": 1,
        "alias": {
            "$cond": [
                { "$eq": [ "$_id", "$id" ] },
                null,
                "$_id"
            ]
        }
    }},
    { "$sort": { "dateOfBirth": 1 } }
]) 

这也可以$ifNull用作自然测试,而不是在$cond不需要的地方使用。

当然,返回的结果是:

{ "_id" : "1", "name" : "Alice", "dateOfBirth" : ISODate("1995-12-27T00:00:00Z"), "alias" : null }
{ "_id" : "2", "name" : "Bob", "dateOfBirth" : ISODate("1996-12-27T00:00:00Z"), "alias" : "4c" }
{ "_id" : "4", "name" : "Cristina", "dateOfBirth" : ISODate("1998-12-27T00:00:00Z"), "alias" : null }
{ "_id" : "6", "name" : "Zoe", "dateOfBirth" : ISODate("2000-12-27T00:00:00Z"), "alias" : "22" }

如果您想“首先按生日”,则将排序移到$group舞台之前$first操作员将在那里进行所有工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您如何在solr中按日期对日期进行分组?

来自分类Dev

如何使用比较器按降序对日期进行排序

来自分类Dev

如何按日期对查询进行排序和分组并在Laravel中将其分组

来自分类Dev

如何在MongoDB中按季度对日期进行分组

来自分类Dev

您如何在字典中对日期进行排序?

来自分类Dev

Mongodb对复杂的JSON进行汇总,匹配,分组和排序

来自分类Dev

如何使用AM | PM对日期文件进行排序

来自分类Dev

如何在jQuery中对日期进行排序

来自分类Dev

Ruby:按年份和月份对日期范围进行分组

来自分类Dev

如何根据日期对日期进行分组?

来自分类Dev

如何在python中按月对日期进行分组

来自分类Dev

如何在SQLite中的季度中对日期进行分组

来自分类Dev

如何使用pd.Grouper按月对日期进行分组?

来自分类Dev

如何通过PHP对日期数组进行排序?

来自分类Dev

使用PHP对日期进行分组

来自分类Dev

XSLT:如何对日期进行排序

来自分类Dev

按升序对日期进行排序

来自分类Dev

如何按日期对查询进行排序和分组,并在Laravel中将其分组为数组

来自分类Dev

如何对日期和相关状态进行分组

来自分类Dev

MongoDB汇总未按日期对文档进行分组

来自分类Dev

如何使用AM | PM对日期文件进行排序

来自分类Dev

流星MongoDB:如何从收集字段中汇总日期范围和计算的结束日期?

来自分类Dev

如何在mysql中对日期进行排序

来自分类Dev

在AngularJS前端中对日期进行排序

来自分类Dev

无法使用结构对日期进行排序

来自分类Dev

如何根据日期对wordpress中的帖子进行分组和排序?

来自分类Dev

对日期数组进行排序

来自分类Dev

如何按小时对日期时间进行分组

来自分类Dev

如何按特定间隔对日期时间列进行子集/汇总?

Related 相关文章

  1. 1

    您如何在solr中按日期对日期进行分组?

  2. 2

    如何使用比较器按降序对日期进行排序

  3. 3

    如何按日期对查询进行排序和分组并在Laravel中将其分组

  4. 4

    如何在MongoDB中按季度对日期进行分组

  5. 5

    您如何在字典中对日期进行排序?

  6. 6

    Mongodb对复杂的JSON进行汇总,匹配,分组和排序

  7. 7

    如何使用AM | PM对日期文件进行排序

  8. 8

    如何在jQuery中对日期进行排序

  9. 9

    Ruby:按年份和月份对日期范围进行分组

  10. 10

    如何根据日期对日期进行分组?

  11. 11

    如何在python中按月对日期进行分组

  12. 12

    如何在SQLite中的季度中对日期进行分组

  13. 13

    如何使用pd.Grouper按月对日期进行分组?

  14. 14

    如何通过PHP对日期数组进行排序?

  15. 15

    使用PHP对日期进行分组

  16. 16

    XSLT:如何对日期进行排序

  17. 17

    按升序对日期进行排序

  18. 18

    如何按日期对查询进行排序和分组,并在Laravel中将其分组为数组

  19. 19

    如何对日期和相关状态进行分组

  20. 20

    MongoDB汇总未按日期对文档进行分组

  21. 21

    如何使用AM | PM对日期文件进行排序

  22. 22

    流星MongoDB:如何从收集字段中汇总日期范围和计算的结束日期?

  23. 23

    如何在mysql中对日期进行排序

  24. 24

    在AngularJS前端中对日期进行排序

  25. 25

    无法使用结构对日期进行排序

  26. 26

    如何根据日期对wordpress中的帖子进行分组和排序?

  27. 27

    对日期数组进行排序

  28. 28

    如何按小时对日期时间进行分组

  29. 29

    如何按特定间隔对日期时间列进行子集/汇总?

热门标签

归档