簡體   English   中英

如何使用 spring 數據標准構建器組合“非”運算符

[英]How to combine "not" operators using the spring data Criteria builder

為了設置場景,我想要生成的查詢類似於我手動編寫的以下查詢。 這個想法是我想從結果集中排除一個日期范圍。 在這種情況下,今天什么都沒有,但如果過去或將來有的話,我想要它們!

{
  "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仍產生相同的輸出。

有什么方法可以生成我想要的查詢,或者從結果集中排除一系列日期的替代方法?

我試過你的mongo shell 和 MongoDB Spring Java 代碼。 shell 代碼工作正常,但使用not()的相應 Java 代碼不起作用(我不知道為什么)。

這是使用您正在尋找的相同功能的另一種方法:

...從今天開始沒有,但如果過去或將來有的話

我正在使用以下輸入文檔:

{ _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的文檔,其中createdOntoday內。

mongo shell 查詢:

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

這將返回帶有_id12的文檔(這些不包括今天的日期)。

對應的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()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM