【问题标题】:Group results in MongoDB [duplicate]在MongoDB中分组结果[重复]
【发布时间】:2019-11-25 18:38:43
【问题描述】:

我有一个如下所述的集合。

当我应用以下过滤器时:

db.getCollection("Marcaciones")
  .find(
    {
      uuid: "12345",
      fecha_registro: { $gte: ISODate("2019-06-20 00:00:00.000Z") },
      fecha_registro: { $lte: ISODate("2019-06-25 23:59:59.999Z") }
    },
    { fecha_registro: 1, _id: 0 }
  )
  .sort({ fecha_registro: -1 });

但我不知道如何对日期和/或类似于 MongoDB 中不同的东西进行分组

我想得到这个结果:

{"fecha_registro": "2019-06-20"},
{"fecha_registro": "2019-06-21"},
{"fecha_registro": "2019-06-22"},
{"fecha_registro": "2019-06-24"},
{"fecha_registro": "2019-06-25"}

使用以下数据集;

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-19 09:11:45.285Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-19 12:22:22.665Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-19 12:54:55.788Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "4", "fecha_registro": ISODate("2019-06-19 18:07:10.138Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-20 08:47:12.982Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-20 12:23:24.866Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-20 13:00:28.387Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "4", "fecha_registro": ISODate("2019-06-20 17:59:57.922Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-21 08:51:17.527Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-21 12:20:23.028Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-21 12:46:06.670Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-22 09:06:18.442Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-22 13:24:17.891Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-22 13:31:00.606Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "4", "fecha_registro": ISODate("2019-06-22 13:31:05.537Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-24 08:51:21.862Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-24 12:28:49.500Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-24 13:08:36.422Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "4", "fecha_registro": ISODate("2019-06-24 18:00:41.499Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-25 08:49:03.776Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-25 13:27:05.152Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-25 13:44:02.609Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-26 08:49:06.356Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-26 12:30:52.041Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "3", "fecha_registro": ISODate("2019-06-26 13:18:37.833Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "4", "fecha_registro": ISODate("2019-06-26 18:02:35.837Z") })

db.Marcaciones.insert({ "uuid": "12345", "tipo": "1", "fecha_registro": ISODate("2019-06-27 08:43:45.077Z") })
db.Marcaciones.insert({ "uuid": "12345", "tipo": "2", "fecha_registro": ISODate("2019-06-27 12:33:16.952Z") })

【问题讨论】:

  • 嗨!我的回答对你有帮助吗?

标签: mongodb


【解决方案1】:

您需要使用aggregate 数组;

使用 4.0.6 版 MongoDB

db.Marcaciones.aggregate(
    [ 
        { $match : { $and : 
                [
                    { uuid : "12345" },
                    { fecha_registro:  {"$gte": ISODate("2019-06-20 00:00:00.000Z")}},
                    { fecha_registro:  {"$lte": ISODate("2019-06-25 23:59:59.999Z")}}
                ]
            } 
        },
        { $project: { fecha_registro: { $dateToString: { format: "%Y-%m-%d", date: "$fecha_registro" } }, _id: 0 } },
        { $group: { _id: '$fecha_registro' } },
        { $sort : { _id : 1 } }
    ]
);

我能够通过上述查询获得以下信息;

{"_id": "2019-06-20"},
{"_id": "2019-06-21"},
{"_id": "2019-06-22"},
{"_id": "2019-06-24"},
{"_id": "2019-06-25"}

重要的部分是$dateToString和$group


如果您希望 fecha_registro 作为最终结果中的名称而不是 _id,您可以 添加;

{ $project: { fecha_registro: "$_id", _id: 0 } }

在聚合结束时。

ps。您的预期数据错误"2019-06-23" 不应该出现在结果中。由于您的收集数据中没有这样的日期...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多