話不多說,直接上代碼。 這是我mongo內的存儲結構如下,我現在需要查找的是
tagName =TT01,targetId=13 並且 timeValueList 這個數組中的 time在我查找的範圍內的數據。
{
"_id" : ObjectId("5e95851ed78d591eec820e2b"),
"serial" : "zth_test",
"label" : "wendu",
"tagName" : "TT01",
"time" : NumberLong(1580879744),
"value" : "1485",
"targetId" : NumberInt(13),
"timeValueList" : [
{
"time" : NumberLong(1580879744),
"value" : "1485"
},
{
"time" : NumberLong(1580879745),
"value" : "1485",
"_class" : "io.renren.common.model.TimeValue"
},
{
"time" : NumberLong(1580879746),
"value" : "1485",
"_class" : "io.renren.common.model.TimeValue"
}
}
我百度了別人的博客看過官網後,java實現。
Query query = new Query();
query.addCriteria(Criteria.where("targetId").is(targetId).andOperator(Criteria.where("tagName").in(tagName)));
query.addCriteria(Criteria.where("timeValueList").elemMatch(Criteria.where("time").gte(startTime).andOperator(Criteria.where("time").lte(endTime))));
/**
* 組裝成的sql語句
* db.getCollection("history").find({"tagName":"TT01","targetId":13}, {"timeValueList":{$elemMatch:{"time":{$gte:1580879744,$lte:1580879746}}}})
*/
List<HistoryData> historyData = mongoTemplate.find(query, HistoryData.class, MongoCollection.HISTORY);