En raison des limitations de BasicDBObject, vous ne pouvez pas ajouter un deuxième '$ et ’

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 List findByIpAndDate(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.