En raison des limites de BasicDBObject, vous ne pouvez pas ajouter un deuxième «$ et»
Problème
En utilisant les données Spring et Mongodb, vous trouverez ci-dessous une fonction pour rechercher des données dans une plage de dates.
public ListfindByIpAndDate(String ip, Date startDate, Date endDate) { Query query = new Query( Criteria.where("ip").is(ip) .andOperator(Criteria.where("createdDate").gte(startDate)) .andOperator(Criteria.where("createdDate").lt(endDate)) ); return mongoOperation.find(query, RequestAudit.class); }
Il frappe le message d'erreur suivant:
org.springframework.data.mongodb.InvalidMongoDbApiUsageException:
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$and'
expression specified as '$and : [ { "createdDate" : { "$lt" : { "$date" : "2013-02-25T16:00:00.000Z"}}}]'.
Criteria already contains '$and : [ { "createdDate" : { "$gte" : { "$date" : "2013-02-24T16:00:00.000Z"}}}]'
Solution
L'ajout de plusieurs opérateurs «$and» sur le même champ «createdDate» fera que Spring l'interprétera comme une mauvaise requête mongodb. Pour le corriger, modifiez la requête comme suit:
Query query = new Query(
Criteria.where("ip").is(ip)
.andOperator(
Criteria.where("createdDate").lt(endDate),
Criteria.where("createdDate").gte(startDate)
)
);
Pour plusieurs critères sur le même champ, utilise une «virgule» pour les combiner.