2012-05-18 5 views
4

Pouvez-vous faire des requêtes paramétrées avec Java et MongoDB - un peu comme des déclarations préparées avec JDBC?requêtes paramétrées avec Java et MongoDB

Ce que je voudrais faire est quelque chose comme ça. Configurez une requête qui prend une plage de dates, puis appelez-la avec des plages différentes. Je comprends que DBCursor.find(...) ne fonctionne pas de cette façon - c'est un peu de pseudo-code pour illustrer ce que je cherche.

DBCollection dbc = ... 
DBObject pQuery = (DBObject) JSON.parse("{'date' : {'$gte' : ?}, 'date' : {'$lte' : ?}}"); 
DBCursor aprilResults = dbc.find(pQuery, "2012-04-01", "2012-04-30"); 
DBCursor mayResults = dbc.find(pQuery, "2012-05-01", "2012-05-31"); 
... 
+0

Lecture sur MongoDB, il me semble que, parce que l'entrée de l'interrogation de MongoDB est pas vraiment une commande, mais plutôt un filtre JSON, il n'y a aucune inquiétude au sujet de quelqu'un injecter valeurs malveillantes. Tout est géré comme des données et non comme des commandes, donc pas besoin de protection. Ai-je raison? –

+0

Je me trompe totalement. Voir un bon exemple sur l'injection NoSql ici - http://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html –

Répondre

2

MongoDB lui-même ne supporte pas quelque chose comme ça, mais là encore, il ne prend pas trop de sens car il a besoin d'envoyer la requête vers le serveur à chaque fois que de toute façon. Vous pouvez simplement construire vous-même l'objet dans votre application et simplement modifier des parties spécifiques en mettant à jour les éléments de tableau corrects.

+0

OK, cela a du sens. Donc, je suppose que ce que je cherche est une API Java tierce sur le Mongo qui le fait - un niveau d'abstraction plus élevé. –

+0

Vous n'avez pas vraiment besoin d'une autre couche d'abstraction bien sûr; vous pouvez le faire vous-même. – Derick

+0

Et si vous utilisez .eval() http://docs.mongodb.org/manual/reference/command/eval/? – loveNoHate

1

Vous devez utiliser Jongo, une API over-pilote mongo-java.

Voici un exemple avec requête paramétrées:

collection.insert("{'date' : #}", new Date(999));    
    Date before = new Date(0); 
    Date after = new Date(1000); 

    Iterable<Report> results = collection.find("{'date' : {$gte : #}, 'date' : {$lte : #}}", before, after).as(Report.class); 
Questions connexes