$ gte и $ lte не работают должным образом в mongodb версии 3.4 - PullRequest
0 голосов
/ 19 июня 2019

У меня есть документы в следующей структуре, сохраненные в моем 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
}

1 Ответ

0 голосов
/ 19 июня 2019

( отправка комментария как ответа, по запросу )

Вот почему ваши два подхода не дают ожидаемых результатов.

Первый не возвращает документ из "2019-03-20 17:52:25", потому что эта строка лексикографически больше (то есть не $lte), чем "2019-03-20" и, следовательно, фильтруется из.

Второй: из-за $or. Только одно условие должно соответствовать документу для включения, и это $gte: '2019-03-19'. Вот почему вы получаете запись от 2019-03-20 (потому что она удовлетворяет этому условию).

А хранить datetime в виде строк - это вообще плохая идея. Это занимает больше места, и вы не можете использовать функции даты и времени (например, извлекать день / месяц / год / и т. Д.). Не говоря уже о том, что правильный порядок сильно зависит от используемого формата. Если это не формат ISO-8601, скорее всего, он не будет правильно сортироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...