Ho bisogno di aiuto per aggiornare il DB di MONGO. ecco il mio documento:
Functions : {
"cgi0-app" : {
"calculatedConfigValues" : {
"floor" : 0.0 ,
"ceiling" : 49.0 ,
"calculatedBrokenValue" : 2.033 },
"userConfigValues" : null },
"shop-app" : {
"calculatedConfigValues" : {
"floor" : 0.0 ,
"ceiling" : 70.0 ,
"calculatedBrokenValue" : 2.413 } } }
Sto cercando di aggiornare il valore del "soffitto" dell'app-negozio da 70 a 100 in MongoDB, ma senza successo. Ecco il mio codice:
BasicDBObject find = new BasicDBObject("Functions.shop app.calculatedConfigValues.floor",0);
BasicDBObject set = new BasicDBObject("$set", new BasicDBObject("Functions.shop- app.calculatedConfigValues.$.ceiling", 100);
getDB().update(find, set);
Qualcuno può aiutarmi per favore cosa sto facendo male?
risposte:
1 per risposta № 1Non è possibile creare realmente DBObjects con la notazione dei punti: è necessario nidificare nuovi BasicDBObjects per ciascun livello nell'albero del documento.
DBObject toFind = new BasicDBObject("Functions",
new BasicDBObject("show-app",
new BasicDBObject("calculatedConfigValues",
new BasicDBObject("floor", 0))));
Lo stesso vale per l'oggetto di aggiornamento
DBObject update = new BasicDBObject("$set",
new BasicDBObject("Functions",
new BasicDBObject("show-app",
new BasicDBObject("calculatedConfigValues",
new BasicDBObject("ceiling", 100)))))
In alternativa, puoi usare Questo Classe di supporto per la traduzione di stringhe json in strutture DBObject come questa.
DBObject toFind = (DBObject) JSON.parse(
"{"Functions.show-app.calculatedConfigValues.floor":0}"
);
Ma sappi che l'uso della classe JSON può causare problemi di prestazioni. È semplicemente più veloce creare manualmente DBObjects.
0 per risposta № 2
Non sei sicuro se questo risolverà il tuo problema, ma non vuoi aggiornare un documento specifico all'interno di una collezione all'interno del DB? Quindi qualcosa in questo senso:
MongoClient mongo = new MongoClient();
DB db = mongo.getDB(DB_NAME);
db.getCollection(COLLECTION_NAME).update(find, set);
Definirei anche trovare in questo modo, perché vuoi l'oggetto specifico da quella raccolta.
BasicDBObject obj = new BasicDBObject();
obj.put(..., 0);
DBObject find = db.getCollection(COLLECTION_NAME).findOne(obj);
Fammi sapere se funziona.