每天查找最新数据

时间:2018-09-19 22:20:02

标签: mongodb mongodb-query

伙计们,我有一个每隔几个小时更新一次的数据库,但是我很难查询来自日期范围的每一天的最新数据。

我的数据库结构如下

{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{}],
        "user": "user10",
        "date" : "2018-09-09 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-10 10:58:18"
}

通过对日期进行分组并获取上次提取的日期,我能够接近想要的行为,像这样:

{ "_id" : "2018-09-15 00:00:00", "extracted_date" : "2018-09-19 13:50:22" }
{ "_id" : "2018-09-16 00:00:00", "extracted_date" : "2018-09-19 13:47:26" }
{ "_id" : "2018-09-17 00:00:00", "extracted_date" : "2018-09-19 13:45:00" }
{ "_id" : "2018-09-11 00:00:00", "extracted_date" : "2018-09-12 10:09:17" }
{ "_id" : "2018-09-12 00:00:00", "extracted_date" : "2018-09-14 15:34:59" }
{ "_id" : "2018-09-14 00:00:00", "extracted_date" : "2018-09-19 13:54:34" }
{ "_id" : "2018-09-13 00:00:00", "extracted_date" : "2018-09-14 15:36:10" }
{ "_id" : "2018-09-18 00:00:00", "extracted_date" : "2018-09-19 13:42:23" }

但是,当我对数据进行分组时,我最终获得了当天的所有值,而我只需要最后一个。这是我使用的查询示例:

db.collection.aggregate({'$match': {'type': 'user', 'date': {'$gte': '2018-09-11 00:00:00', '$lte': '2018-09-18 00:00:00'}}}, {'$group': {'_id': {'type': '$type', 'user': '$user', 'date': '$date'}, 'extracted_date': {'$last': '$extracted_date'}, 'values': {'$push': '$values'}}})

如果可能的话,我想检索与数据库使用的结构接近的信息。

非常感谢您的帮助!

编辑:这是我需要的一个案例。

数据库对象:

{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{'field1': 1, 'field2': 3}],
        "user": "user10",
        "date" : "2018-09-09 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-10 10:58:18"
}
{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{'field1': 1, 'field2': 4}],
        "user": "user10",
        "date" : "2018-09-09 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-11 10:58:18"
}
{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{'field11': 2, 'field2': 10}],
        "user": "user11",
        "date" : "2018-09-05 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-10 10:58:18"
}

预期收益:

{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{'field1': 1, 'field2': 4}],
        "user": "user10",
        "date" : "2018-09-09 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-11 10:58:18"
}
{
        "_id" : ObjectId("5b96787ebe9d44528eaa18a0"),
        "values" : [{'field11': 2, 'field2': 10}],
        "user": "user11",
        "date" : "2018-09-05 00:00:00",
        "type" : "patient",
        "extracted_date" : "2018-09-10 10:58:18"
}

由于从同一日期开始有2个对象被拒绝,因此它仅返回具有最近extract_date的对象。

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您只想获取b !mask数组,而不是将当天的所有数组合并在一起...

因此,像对待mask = (fabs(u) >= fabs(v))一样对值进行last

更新

由于您要查找该范围的最新数据,因此需要根据values的建议使用$last,然后从extracted_date中取出所需字段,然后隐藏sort

matthPen

您可以看到它here

答案 1 :(得分:0)

想想您在“每天的最后一天”(每天晚些时候出现的那个)和$ last(最后一个来自管道中前一阶段的消息)之间感到困惑!

您需要在分组之前添加一个排序阶段,以确保$ last是“最后一个”。

db.collection.aggregate({
  "$match": {
    "type": "user",
    "date": {
      "$gte": "2018-09-11 00:00:00",
      "$lte": "2018-09-18 00:00:00"
    }
  }
}, 
{$sort:{
  date:1,
  extracted_date:1
}
},
{
  "$group": {
    "_id": {
      "type": "$type",
      "user": "$user",
      "date": "$date"
    },
    "extracted_date": {
      "$last": "$extracted_date"
    },
    "values": {
      "$last": "$values"
    }
  }
})