Как объединить «не» операторов с помощью конструктора Criteria для данных о пружине - PullRequest
0 голосов
/ 23 марта 2020

Чтобы настроить сцену, запрос, который я хочу произвести, похож на следующий, который я написал вручную. Идея состоит в том, что я хочу исключить диапазон дат из набора результатов. В данном случае ничего с сегодняшнего дня, но если что-то есть в прошлом или будущем, я хочу их!

{
  "createdOn": {
    $not: {
      "$lte": ISODate("2020-20-23T23:59:59.999999999"),
      "$gte": ISODate("2020-20-23T00:00"),
    }
  }
}

Код, который я использую, чтобы попытаться получить вышеуказанное, следующий:

Criteria.where("createdOn")
    .not()
    .gte(LocalDate.now().atTime(LocalTime.MIN))
    .lte(LocalDate.now().atTime(LocalTime.MAX))

Однако при этом генерируется следующее:

{
  "createdOn": {
    "$not": {
      "$gte": {
        "$java": "2020-03-23T00:00"
      }
    },
    "$lte": {
      "$java": "2020-03-23T23:59:59.999999999"
    }
  }
}

Если я изменил код, добавив еще один not до lte, он все равно выдаст тот же вывод.

Есть ли способ создания запроса, который я хочу, или альтернативный способ исключения диапазона дат из набора результатов?

1 Ответ

1 голос
/ 24 марта 2020

Я попробовал вашу mongo оболочку и код MongoDB Spring Java. Код оболочки работает нормально, но соответствующий код Java с использованием not() не работает (я не знаю почему).

Вот еще один способ работы с той же функциональностью, которую вы ищете:

... ничего с сегодняшнего дня, но если таковые имеются в прошлом или будущем

Я использую следующие входные документы:

{ _id: 1, createdOn: ISODate("2020-03-21T12:05:00") },
{ _id: 2, createdOn: ISODate("2020-03-28T18:33:00") },
{ _id: 3, createdOn: ISODate("2020-03-24T01:56:00") }

И, предполагая сегодняшнюю дату : ISODate("2020-03-24T02:50:04.992Z"), в результате следует исключить документ с _id: 3, где createdOn находится в пределах сегодня .

Запрос оболочки mongo:

db.collection.find( {
  $or: [
    { createdOn: { $gt: ISODate("2020-03-24T23:59:59.99") } },
    { createdOn: { $lt: ISODate("2020-03-24T00:00:00") } }
  ]
} )

Возвращает документы с _id 1 и 2 (исключая сегодняшнюю дату).

Соответствующий Java код:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd H:m:s");
Date fromDate = dateFormat.parse("2020-03-24 00:00:00");
Date toDate = dateFormat.parse("2020-03-24 23:59:59");

Criteria c = new Criteria().orOperator(
                           Criteria.where("createdOn").lt(fromDate),
                           Criteria.where("createdOn").gt(toDate) );        
Query q = Query.query(c);

MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "testDB");
List<Document> result = mongoOps.find(q, Document.class, "collection");
result.forEach(doc -> System.out.println(doc.toJson()));
...