mongodb 函数 aggregate 查询条件中日期类型不起作用
第一种日期写法:
=mongo_shell(A1, “2c9a02e177e8fa9201782092a578709f.aggregate([{$match:{‘status’: true,‘data_time’: {‘$gte’: ISODate(‘2022-01-01T00:00:00.000Z’), ‘$lt’: ISODate(‘2022-06-11T23:59:59.999Z’)}}},
{$group:{‘_id’: {‘2c9a02e1783b5e370178913dab1a1105’: ‘$2c9a02e1783b5e370178913dab1a1105’, ‘2c9a02e1783b5e370178913dd50c1112’: ‘$2c9a02e1783b5e370178913dd50c1112’}, ‘2c9a02e1783b5e3701783f0882a15014’: {‘$sum’: ‘$2c9a02e1783b5e3701783f0882a15014’}}}])”)
第二种日期写法:
=mongo_shell(A1, “2c9a02e177e8fa9201782092a578709f.aggregate([{$match:{‘status’: true,‘data_time’: {‘$gte’: {‘$date’:‘2022-01-01T00:00:00.000Z’}, ‘$lt’: {‘$date’:‘2022-06-11T23:59:59.999Z’}}}},
{$group:{‘_id’: {‘2c9a02e1783b5e370178913dab1a1105’: ‘$2c9a02e1783b5e370178913dab1a1105’, ‘2c9a02e1783b5e370178913dd50c1112’: ‘$2c9a02e1783b5e370178913dd50c1112’}, ‘2c9a02e1783b5e3701783f0882a15014’: {‘$sum’: ‘$2c9a02e1783b5e3701783f0882a15014’}}}])”)
data_time 是 Timestamp 类型,如果 aggregate 增加上 data_time 过滤条件不返回任务数据。
如果去掉 data_time 条件,则可以返回数据,脚本如下。
=mongo_shell(A1, “2c9a02e177e8fa9201782092a578709f.aggregate([{$match:{‘status’: true}},
{$group:{‘_id’: {‘2c9a02e1783b5e370178913dab1a1105’: ‘$2c9a02e1783b5e370178913dab1a1105’, ‘2c9a02e1783b5e370178913dd50c1112’: ‘$2c9a02e1783b5e370178913dd50c1112’}, ‘2c9a02e1783b5e3701783f0882a15014’: {‘$sum’: ‘$2c9a02e1783b5e3701783f0882a15014’}}}])”)
如果 mongodb 查询 find 可以使用 data_time 参数过滤,可以正确返回数据,脚本如下。
=mongo_shell(A1, “2c9a02e177e8fa9201782092a578709f.find({‘status’: true,‘data_time’: {‘$gte’: {‘$date’:‘2022-01-01T00:00:00.000Z’}, ‘$lt’: {‘$date’:‘2022-06-11T23:59:59.999Z’}}})”)
aggregate 函数如果不使用集算器 spl 语法,直接使用 java 驱动调用 mongodb 数据库是可以正确返回数据的。下面是我直接调用 mongodb java 驱动语法,如图:
java 程序用到的驱动包
我比对了一下集算器使用的驱动包
![imagepng](https://img.raqsoft.com.cn/file/2022/
test_datedfx
06/2ea708bc9a574ba382d4caa9e960d0ba_image.png)
集算器用的是 4.3,很能猜用的是 4.1,我把集算器的驱动包换成了 4.1。再次尝试运行结果,发现一样没有数据。
附件中是我测试的脚本文件
test_daterar
mongo_shell 是执行了一个 mongo 命令,这个命令语句是否有问题,可以用 mongo java api 里的 runCommand 验证,也可以用它的其它执行命令方式验证。
你在 java 里运行成功的 mongo aggregate 方法,不一定完全等价于 mongo 命令。
还是要从验证 mongo 命令本身的角度试试。
测试数据:
db.loginHistory.insert({
“_class” : “com.aaa.LoginHistory”,
“uid” : “94989000”,
“ip” : “192.168.1.219”,
“imei” : “865736037366641”,
“platform” : “linux”,
“timestamp” : ISODate(“2017-12-16T04:47:36.340Z”)
})
db.loginHistory.insert({
“_class” : “com.aaa.LoginHistory”,
“uid” : “94989111”,
“ip” : “192.168.1.219”,
“imei” : “865736037366641”,
“platform” : “Android”,
“timestamp” : ISODate(“2017-12-12T04:47:36.340Z”)
})
db.loginHistory.insert({
“_class” : “com.aaa.LoginHistory”,
“uid” : “94989111”,
“ip” : “192.168.1.219”,
“imei” : “865736037366641”,
“platform” : “Android”,
“timestamp” : ISODate(“2017-12-12T06:47:36.340Z”)
})
db.loginHistory.insert({
“_class” : “com.aaa.LoginHistory”,
“uid” : “94989111”,
“ip” : “192.168.1.219”,
“imei” : “865736037366641”,
“platform” : “Android”,
“timestamp” : ISODate(“2017-12-15T06:47:36.340Z”)
})
测试脚本:
=mongo_shell@d (A1,“{‘aggregate’:‘loginHistory’,
‘pipeline’ : [{ ‘$match’:{
‘timestamp’:{
‘$gte’:ISODate(‘2017-01-31T04:47:36.340Z’),
‘$lte’:ISODate(‘2019-09-01T04:47:36.340Z’)
}} },
{$group: { _id: ‘$platform’, total: { $sum: 1} } }
], cursor: {}}”
)
参考 Mongo API(https://www.mongodb.com/docs/manual/reference/command/aggregate/#mongodb-dbcommand-dbcmd.aggregate),需要使用 runCommand(json) 接口方式,传递的参数为 json 格式。
升级了一下集算器版本,升级了 jar 文件,可以了。