【问题标题】:Wrong result using $gte and $lt operators in mongo for date field在 mongo 中使用 $gte 和 $lt 运算符作为日期字段的错误结果
【发布时间】:2017-09-29 02:06:01
【问题描述】:

我是 mongo 的新手,所以我希望我在这里遗漏了一些简单的东西。我有 28 个文档,其 create_timestamp 值为以下 -

{ "id" : NumberLong(96), "create_timestamp" : ISODate("2017-09-18T09:00:00Z") }
{ "id" : NumberLong(97), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(104), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(106), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(109), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(110), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(120), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(121), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(122), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(124), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(125), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(126), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(128), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(129), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(130), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(132), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(136), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(140), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(145), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }
{ "id" : NumberLong(150), "create_timestamp" : ISODate("2017-09-20T15:37:51.575Z") }

我正在使用 create_timestamp >= ISODate("2017-09-19") AND 查询所有文档 create_timestamp

db.transfer_order.find( { $and: [ {"create_timestamp": { $gte: ISODate("2017-09-19")}, "create_timestamp": { $lt: ISODate("2017-09- 20")}}]}, {_id: 0, id: 1, create_timestamp: 1})

{ "id" : NumberLong(96), "create_timestamp" : ISODate("2017-09-18T09:00:00Z") }

为什么会这样?为什么这是返回此文档的查询?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您正在用第二个覆盖第一个 create_timestamp 键值。

    您查询的效率如此之高

    db.transfer_order.find( 
    { $and: [ {"create_timestamp": { $lt: ISODate("2017-09-20")}}]}, 
    {id: 1, create_timestamp: 1})
    

    当为多个值查询同一个键时,您可以使用隐式与。

    db.transfer_order.find( 
    {"create_timestamp": { $gte: ISODate("2017-09-19"), $lt: ISODate("2017-09-20")}}, 
    {id: 1, create_timestamp: 1})
    

    使用显式与

    db.transfer_order.find( 
    { $and: [ {"create_timestamp": { $gte: ISODate("2017-09-19")}}, {"create_timestamp": { $lt: ISODate("2017-09-20")}}]}, 
    {id: 1, create_timestamp: 1})
    

    更多https://docs.mongodb.com/manual/reference/operator/query/and/

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多