Untuk mengatur adegan, kueri yang ingin saya hasilkan mirip dengan yang berikut yang saya tulis secara manual. Idenya adalah saya ingin mengecualikan rentang tanggal dari kumpulan hasil. Dalam hal ini, tidak ada dari hari ini, tetapi jika ada di masa lalu atau di masa depan, saya menginginkannya!

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

Kode yang saya gunakan untuk mencoba dan mendapatkan yang di atas adalah sebagai berikut:

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

Namun, itu menghasilkan yang berikut:

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

Jika saya mengubah kode untuk menambahkan not lain sebelum lte masih menghasilkan output yang sama.

Apakah ada cara untuk menghasilkan kueri yang saya inginkan, atau cara alternatif untuk mengecualikan rentang tanggal dari kumpulan hasil?

0
Adam Lavin 23 Maret 2020, 21:47

1 menjawab

Jawaban Terbaik

Saya mencoba shell mongo Anda dan kode Java MongoDB Spring. Kode shell berfungsi dengan baik, tetapi kode Java yang sesuai menggunakan not() tidak berfungsi (saya tidak tahu mengapa).

Berikut adalah cara lain untuk bekerja dengan fungsi yang sama yang Anda cari:

... tidak ada dari hari ini, tetapi jika ada di masa lalu atau di masa depan

Saya menggunakan dokumen input berikut:

{ _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") }

Dan, dengan asumsi tanggal hari ini: ISODate("2020-03-24T02:50:04.992Z"), hasilnya harus mengecualikan dokumen dengan _id: 3, di mana createdOn berada dalam hari ini.

Kueri shell mongo:

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

Ini mengembalikan dokumen dengan _id 1 dan 2 (ini tidak termasuk tanggal hari ini).

Kode Java yang sesuai:

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()));
1
prasad_ 24 Maret 2020, 05:09