在MongoDB中分组结果

时间:2019-07-17 01:02:36

标签: mongodb

我有一个如下所述的收藏集。

当我应用以下过滤器时:

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") })

1 个答案:

答案 0 :(得分: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"不应包含在结果中。由于您的收集数据中没有这样的日期...