【问题标题】:$gte and $lte not working properly in mongodb version 3.4$gte 和 $lte 在 mongodb 3.4 版中无法正常工作
【发布时间】:2019-06-19 07:23:28
【问题描述】:

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

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

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

这就是您的两种方法未能产生预期结果的原因。

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

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

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

【讨论】:

  • 我相信这些提示足以帮助 OP 进行所需的更改。
猜你喜欢
  • 2019-07-07
  • 2021-07-12
  • 1970-01-01
  • 2019-05-04
  • 2023-04-09
  • 2016-11-17
  • 2021-09-17
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多