MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment combiner des opérateurs not à l'aide du générateur de critères de données de printemps

J'ai essayé votre mongo shell et le code Java de MongoDB Spring. Le code shell fonctionne bien, mais le code Java correspondant utilisant le not() ne fonctionne pas (je ne sais pas pourquoi).

Voici une autre façon de travailler avec la même fonctionnalité que vous recherchez :

J'utilise les documents d'entrée suivants :

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

Et, en supposant la date d'aujourd'hui :ISODate("2020-03-24T02:50:04.992Z") , le résultat doit exclure le document avec _id: 3 , où le createdOn est dans aujourd'hui .

Le mongo requête shell :

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

Cela renvoie les documents avec _id est 1 et 2 (ceux-ci excluent la date d'aujourd'hui).

Le code Java correspondant :

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()));