Domanda

Sto provando contro un database con un documento in esso.Con il seguente codice ottengo il seguente risultato dal database

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());
}
.

Questo stampa i seguenti dati

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

Il documento ha anche un campo "numrshares" impostato su un valore di 2.34508872.Volendo provare i $ GT, $ GTE, $ LT, $ LTE e $ NE Operator, aggiungo una linea di codice dopo l'ultima linea "tays.put () '.

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

Questo codice dovrebbe continuare a selezionare il documento LONE, poiché il campo NUMShares è effettivamente maggiore o uguale a zero.Invece ottengo il seguente errore.

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

L'obiettivo è in definitiva avere un equivalente mongolodb della query SQL "Seleziona prezzo, simbolo, scambiarsi dallo stock in cui numrshares>= 0, ecc ..."

Mi rendo conto che mkyong non copre questa particolare struttura di query nel suo tutorial, quindi ti sto chiedendo tutti.Grazie

È stato utile?

Soluzione

È necessario inserire i tuoi argomenti di query di restrizione dei risultati al primo oggetto della query.Il secondo oggetto è una proiezione del risultato.Può solo specificare i tag da visualizzare (come true / 1 o false / 0) non ci sono altre restrizioni come "$ LTE" consentito.Mettendolo all'oggetto di query come nel seguente dovrebbe funzionare:

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);
.

Anche i tasti dei documenti dei mongodbs sono case-sensitive.Quindi se la tua chiave è "numrshares" non riesci a trovarlo cercando "numrshares".

Altri suggerimenti

Si desidera inserire i criteri nella query, non nell'elenco dei tasti che desideri tornare:

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());
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top