mongo版本:3.2.3
使用查询工具:robomongo
文档结构:
{
“_id”:NumberLong(585080),
“create_time”:ISODate(“2018-03-16T06:44:09.234Z”),
“content”:[
{“type”:100001,”code”:”abcde”,”code_name”:”xxxx”},
{“type”:100002,”code”:”qwert”,”code_name”:”zzzz”},
]
}
目标:实现类似如下SQL语句,按日期区间查询数据,content数组拆成多条数据。
select _id,create_time,content.type as type, content.code as code,content.code_name as code_name
from table t where t.create_time>=v_start_dt and t.create_time<v_end_dt;
如下写法可以查到数据(查询日期介于2018-03-16至2018-03-17的数据):
db.getCollection(‘favstock’).aggregate([
{$match:{“create_time”:{$gte:ISODate(“2018-03-16”),$lt:ISODate(“2018-03-17″)}}},
{$unwind:”$content”},
{$project:{
“_id”:1,
“create_time”:1,
“create_time8″:{$dateToString:{format:”%Y-%m-%d %H:%M:%S.%L”,date:{$add:[“$create_time”,8*60*60*1000]}}},
“type”:”$content.type”,
“code”:”$content.code”,
“code_name”:”$content.code_name”
}}
]);
但是发现如果查询区间有“日期加减”的话(使用$add),就查不到数据了,比如这里的开始时间加上3个小时,理论上也应该查到数据的,毕竟数据中的日期是ISODate(“2018-03-16T06:44:09.234Z”),而且$project中以{$add:[ISODate(“2018-03-16”),3*3600*1000]}新造一个字段也是可以的,但这里$match中就“无效”,没有报语法错误,但也查不到结果。
db.getCollection(‘favstock’).aggregate([
{$match:{“create_time”:{$gte:{$add:[ISODate(“2018-03-16”),3*3600*1000]},$lt:ISODate(“2018-03-17″)}}},
{$unwind:”$content”},
{$project:{
“_id”:1,
“create_time”:1,
“create_time8″:{$dateToString:{format:”%Y-%m-%d %H:%M:%S.%L”,date:{$add:[“$create_time”,8*60*60*1000]}}},
“type”:”$content.type”,
“code”:”$content.code”,
“code_name”:”$content.code_name”,
“date1”:{$add:[ISODate(“2018-03-16”),3*3600*1000]}
}}
]);
新手刚接触mongo,还请大神指导一下,万分感谢!
在$match里面需要$expr来操作。可以实现这个功能。
db.favstock.aggregate([{$match:{$expr:{“$gte”:[“$create_time”,{$add:[ISODate(“2018-03-16”),3*3600*1000]}]},create_time:{$lt:ISODate(“2018-03-17″)}}},{$unwind:”$content”},{$project:{_id:1,create_time:1,type:”$content.type”,code:”$content.code”,createtime8:{$add:[ISODate(“2018-03-16″),3*60*60*1000]},create_time8:{$dateToString:{format:”%Y-%m-%d %H:%M:%S.%L”,date:{$add:[“$create_time”,8*60*60*1000]}}}}}])
{ “_id” : NumberLong(585080), “create_time” : ISODate(“2018-03-16T06:44:09.234Z”), “type” : 100001, “code” : “abcde”, “createtime8” : ISODate(“2018-03-16T03:00:00Z”), “create_time8” : “2018-03-16 14:44:09.234” }
{ “_id” : NumberLong(585080), “create_time” : ISODate(“2018-03-16T06:44:09.234Z”), “type” : 100002, “code” : “qwert”, “createtime8” : ISODate(“2018-03-16T03:00:00Z”), “create_time8” : “2018-03-16 14:44:09.234” }