我的mongodb version 3.40
中保存了以下结构的文档
测试
{
"_id" : ObjectId("5d08ad7ed510022ebc548905"),
"userId" : "2",
"startTime" : "2019-03-20 17:52:25",
"endTime" : "2019-03-20 17:53:49",
"loginTime" : 10
},
{
"_id" : ObjectId("5d08ad7ed510022ebc548904"),
"userId" : "1",
"startTime" : "2019-03-20 17:52:25",
"endTime" : "2019-03-20 17:53:49",
"loginTime" : 10
},{
"_id" : ObjectId("5d08ad7ed510022ebc548903"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 55
},
{
"_id" : ObjectId("5d08ad7ed510022ebc548902"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 84
}
现在,我想获取类似gte
和lte
的结果,我已经编写了查询,但是无法正常工作。这意味着我没有得到预期的输出。
我的输出低于
{
"_id" : ObjectId("5d08ad7ed510022ebc548902"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 84
},
{
"_id" : ObjectId("5d08ad7ed510022ebc548903"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 55
}
预期产量
{
"_id" : ObjectId("5d08ad7ed510022ebc548902"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 84
},
{
"_id" : ObjectId("5d08ad7ed510022ebc548903"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 55
},
{
"_id" : ObjectId("5d08ad7ed510022ebc548904"),
"userId" : "1",
"startTime" : "2019-03-20 17:52:25",
"endTime" : "2019-03-20 17:53:49",
"loginTime" : 10
}
我的代码
db.test.aggregate([
{ "$match":
{
'userId' : { $in : ['1']},
'startTime': {$gte: '2019-03-19' },
'endTime': {$lte: '2019-03-20' }
}
}
])
我已经搜索了很多次,但是我得到了答案,请任何人帮助我,如果可能的话,请在此处发布答案
更新的代码但不起作用
db.test.aggregate([
{
$match: {
$and: [
{userId: {$in: ["1"]}},
{ $or : [ { startTime : { $gte : '2019-03-19' } }, { endTime : { $lt : '2019-03-19' } } ] }
]
}
}
])
预期的输出我不应该得到2019-03-20
获取输出
/* 1 createdAt:6/18/2019, 2:53:10 PM*/
{
"_id" : ObjectId("5d08ad7ed510022ebc548902"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 84
},
/* 2 createdAt:6/18/2019, 2:53:10 PM*/
{
"_id" : ObjectId("5d08ad7ed510022ebc548903"),
"userId" : "1",
"startTime" : "2019-03-19 17:52:25",
"endTime" : "2019-03-19 17:53:49",
"loginTime" : 55
},
/* 3 createdAt:6/18/2019, 2:53:10 PM*/
{
"_id" : ObjectId("5d08ad7ed510022ebc548904"),
"userId" : "1",
"startTime" : "2019-03-20 17:52:25",
"endTime" : "2019-03-20 17:53:49",
"loginTime" : 10
}
答案 0 :(得分:0)
(根据要求发布评论作为答案)
这就是为什么您的两种方法无法产生预期的结果的原因。
第一个不返回“ 2019-03-20 17:52:25”中的文档,因为该字符串在字典上比“ 2019-03-20”大(即,不是$lte
),因此被过滤掉。
第二个:由于$or
。只有一个条件需要匹配才能包括在内,即$gte: '2019-03-19'
。这就是为什么您会在2019-03-20获得记录(因为它满足该条款)。
将日期时间存储为字符串通常不是一个好主意。它占用更多空间,并且您不能使用日期时间函数(例如提取日/月/年/等)。更不用说正确的排序在很大程度上取决于所使用的格式。如果不是ISO-8601格式的格式,则可能无法正确排序。