查询最后的设备文档

时间:2019-02-26 23:12:35

标签: mongodb

我有一个mongodb,用于存储IoT设备的历史数据。 mongo db上的文档是这样的:

  "_id": {
        "$oid": "5c5f97b9fd01ff005ab5a101"
    },
    "temperature": -1,
    "datetime": 1549768633858,
    "deviceId": 4085799
}

    "_id": {
        "$oid": "5c5f97b9fd01ff005ab5a102"
    },
    "temperature": -27,
    "datetime": 1549768633863,
    "deviceId": 4085587
}

我想找到每个设备的最新文档。我正在使用以下查询

db.getCollection("sensors").find(
    { 
        "deviceId" : {
            "$in" : [
                4085799, 
                4085587
            ]
        }
    }
)
).limit(2);

它仅返回两个文档,但是如果数据库中不存在其中一个设备,我将找到与该设备重复的结果。 例如,如果4085799不存在,我会得到

{ 
    "_id" : ObjectId("5c75b5a3f8d4d0005d90e1bf"), 
    "temperature" : NumberInt(-27), 
    "datetime" : 1551218083021.0, 
    "deviceId" : NumberInt(4085587)
}
// ----------------------------------------------
{ 
    "_id" : ObjectId("5c75b21ff8d4d0005d90e1b8"), 
    "temperature" : NumberInt(-27), 
    "datetime" : 1551217183157.0, 
    "deviceId" : NumberInt(4085587)
}
// ----------------------------------------------

如果deviceId = 4085799不在数据库中,我怎么只能得到一个结果?

1 个答案:

答案 0 :(得分:0)

使用Aggregation(mongoDB 3.6或更高版本),您可以找到每个设备的最后一个文档。

db.sensors.aggregate([
  { $sort: { _id: -1 } },
  { $group: {
      _id: "$deviceId",
      id: { $first: "$_id" },
      temperature: { $first: "$temperature" },
      deviceId: { $first: "$deviceId" },
      datetime: { $first: "$datetime" }
    }
  }
])