$ gte和$ lte在mongodb 3.4版中无法正常工作

时间:2019-06-19 07:23:28

标签: mongodb mongodb-query

我的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
}

现在,我想获取类似gtelte的结果,我已经编写了查询,但是无法正常工作。这意味着我没有得到预期的输出。

我的输出低于

{
    "_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
}

1 个答案:

答案 0 :(得分:0)

根据要求发布评论作为答案

这就是为什么您的两种方法无法产生预期的结果的原因。

第一个不返回“ 2019-03-20 17:52:25”中的文档,因为该字符串在字典上比“ 2019-03-20”大(即,不是$lte),因此被过滤掉。

第二个:由于$or。只有一个条件需要匹配才能包括在内,即$gte: '2019-03-19'。这就是为什么您会在2019-03-20获得记录(因为它满足该条款)。

将日期时间存储为字符串通常不是一个好主意。它占用更多空间,并且您不能使用日期时间函数(例如提取日/月/年/等)。更不用说正确的排序在很大程度上取决于所使用的格式。如果不是ISO-8601格式的格式,则可能无法正确排序。