2013-06-26 2 views
3

Dans un projet sur lequel je travaille, à un moment donné, j'ai lu une requête à mongodb à partir d'une chaîne. J'ai utilisé com.mongodb.util.JSON.parse(querystring) pour lire la requête, qui a fonctionné correctement jusqu'à ce que j'ai commencé à lire des requêtes qui contenaient des opérateurs comme $ max et $ min. À ce stade, plutôt que d'utiliser l'opérateur $ max de mongodb, l'analyseur crée à la place un champ "$ max". Par exemple,Analyser des chaînes dans des documents de requête mongodb avec des opérateurs dans java

la chaîne d'entrée:

{ $query : { state : "AL" } , $max : { pop : 9058 } } 

est analysé à la dbobject:

{ "$query" : { "state" : "AL"} , "$max" : { "pop" : 9058}} 

Quand je regarde alors un dbcursor avec ce document de requête, je reçois un curseur de taille 0 (aucun document correspondant trouvé dans la base de données), vraisemblablement parce qu'il n'y a pas de documents avec des champs "$ query" ou "$ max".

Y at-il quelque chose que je peux utiliser en plus de JSON.parse()? Je ne suis pas opposé à écrire ma propre fonction pour cela, mais comment puis-je obtenir un objet DBObject qui reconnaît les opérateurs $ comme des opérateurs et non des champs?

Un conseil serait apprécié!

Répondre

0

Donc, il se avère que le DBObject tel qu'abandonné là-bas a bien fonctionné. Il renvoie un curseur avec une taille de 0, true, mais la longueur du DBCursor est réellement la chose que je cherchais. (Auparavant, j'avais vérifié si la taille du curseur était 0, et si c'était le cas, retourner null.Je ne suis pas sûr de la différence entre la taille et la longueur dans un DBCursor (la différence entre la taille et le nombre est évidente, mais je ne suis pas sûr de la longueur supposée), mais cela fonctionne maintenant . Dans le cas ci-dessus, la taille et le nombre étaient tous les deux 0 mais la longueur était le nombre désiré.

0

L'extrait de code suivant utilisant l'opérateur de modification de requête $ max semble fonctionner correctement.

/* {$query:{state:"AL"}, "$max":{pop:10000}}*/ 
String s = "{$query:{state:\"AL\"}, \"$max\":{pop:10000}}"; 
DBObject dbObject = (DBObject) JSON.parse(s); 
System.out.println("\nFind all: "); 

DBCursor cursor = collection.find(dbObject); 

try { 
    while (cursor.hasNext()) { 
     DBObject cur = cursor.next(); 
     System.out.println(cur); 
    } 
} finally { 
    cursor.close(); 
} 

Assurez-vous que vous avez spécifié index sur pop.

db.zips.getIndexes()
[
{
"v": 1,
"clé": {
"_id": 1
},
« ns ": "test.zips",
"name":" id "
}, {

"v": 1,
"clé": {
"pop": 1
},
"ns": "test.zips",
"name": "pop_1"
}
]

Voir le lien suivant pour plus de détails. Au cas où vous souhaiteriez utiliser les opérateurs d'agrégation $ max ou $ min, le lien suivant fournit des détails et un exemple de code.
http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/

+0

Cela fonctionne bien, même si je me suis retrouvé avec une solution différente. Merci quand même! – firechant

Questions connexes