0

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,还请大神指导一下,万分感谢!

已回答的问题