Question

Je teste sur une base de données avec un seul document.Avec le code suivant, je reçois le résultat suivant de la base de données

BasicDBObject keys = new BasicDBObject();
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", "SH");
keys.put("NumShares", new BasicDBObject("$gte", 0) );

BasicDBObject empty = new BasicDBObject();

DBCursor cursor_02 = coll_tmp.find( empty, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
    System.out.println( "<2>  " + cursor_02.next());
}

Ceci imprimera les données suivantes

<2>  { <id & oid> , "symbol" : "ESLR" , "Exchange" : "SH"}

Le document contient également un champ "numshares" défini sur une valeur de 2.34508872.Voulant essayer les opérateurs $ LT, $ GTE, $ LT, $ LTE et $ NE, I Ajouter dans une ligne de code après la dernière "Keys.put ()".

keys.put("Price", new BasicDBObject("$gte", 0) );

Ce code devrait continuer à sélectionner le document solitaire, car son champ Numshares est en effet supérieur ou égal à zéro.Au lieu de cela, j'obtiens l'erreur suivante.

Can't canonicalize query: BadValue Unsupported projection option: NumShares: { $gte: 0 }

L'objectif est finalement d'avoir un équivalent de MongoDB de la requête SQL "Sélectionner le prix, le symbole, Shanger de stock où numshares>= 0, etc ..."

Je réalise que Mkyong ne couvre pas cette structure de requête particulière dans son tutoriel, donc je vous demande tous.Merci

Était-ce utile?

La solution

Vous devez mettre vos arguments de requête restreignant vos résultats à votre premier objet de la requête.Le deuxième objet est une projection du résultat.Il ne peut spécifier que les étiquettes à afficher (comme vrai / 1 ou faux / 0) Il n'y a pas d'autres restrictions telles que "$ LTE" autorisées.La mise à l'objet de la requête comme dans ce qui suit devrait fonctionner:

BasicDBObject keys = new BasicDBObject();
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", 1);

BasicDBObject search = new BasicDBObject();
search.put("Exchange", "SH");
search.put("numShares", new BasicDBObject("$gte", 0) );

DBCursor cursor_02 = coll_tmp.find(search, keys);

Les touches de Mongodbs des documents sont sensibles à la casse.Donc, si votre clé est "numshares", vous ne pouvez pas le trouver en recherchant des "numshares".

Autres conseils

Vous souhaitez mettre vos critères dans la requête, pas dans la liste des touches que vous souhaitez revenir:

BasicDBObject keys = new BasicDBObject(); // will specify the returned fields (SELECT)
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", 1);

BasicDBObject query = new BasicDBObject(); // will select the documents you want (WHERE)
query.put("numShares", new BasicDBObject("$gte", 0) ); 

DBCursor cursor_02 = coll_tmp.find( query, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
    System.out.println( "<2>  " + cursor_02.next());
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top