Comment puis-je mettre à jour des documents de mongo db à l'aide du pilote java?
Références:
Encore assez nouveau pour mongo db, mais je vais essayer de mettre à jour une partie d'un document existant à l'intérieur d'une collection... malheureusement, le lien ci-dessus n'ont pas une mise à jour exemple.
Essentiellement, je veux juste être en mesure de:
- Ajouter de nouveaux champs à un document
- Mettre à jour les champs d'un document
une nouvelle valeur
Voici mon code (Grain + Groovy + Java + MongoDB + le pilote java):
def shape = mongo.shapes.findOne(new BasicDBObject("data", "http://www.foo.com")); //get the document
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("isProcessed", 0)); //add a new "isProcessed" field set to 0
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("data", "http://www.bar.com"));
Ce joli beaucoup clobbers l'ensemble de l'objet... je pourrais essayer seulement la modification de la forme d'origine de l'objet, puis en exécutant la mise à jour sur qui. Mais jusqu'alors, quelqu'un a une expérience de la mise à jour juste champs individuels (plutôt que la totalité du document)?
EDIT:
Je l'ai juste essayé et a réussi à mettre à jour par l'envoi de la totalité de l'objet à travers avec les nouvelles et/ou mis à jour les champs et qui fonctionne. Je me demande si le pilote est assez intelligent pour ne mettre à jour le plus petit sous-ensemble de change ou si c'est juste aveuglément la mise à jour de l'ensemble de la chose? (Dans le cas ci-dessous, c'est juste de la mise à jour de la foo terrain à l'autre bout du fil ou de toute forme de document?)
Code:
def shape = mongo.shapes.findOne(); //get the first shape to use as a base
shape.removeField("_id"); //remove the id field
shape.put("foo","bar"); //add a new field "foo"
mongo.shapes.insert(shape); //insert the new shape
def shape2 = mongo.shapes.findOne(new BasicDBObject("foo", "bar")); //get the newly inserted shape (and more importantly, it's id)
shape2.put("foo", "bat"); //update the "foo" field to a new value
mongo.shapes.update(new BasicDBObject("_id", shape2._id), shape2); //update the existing document in mongo
Vous devez vous connecter pour publier un commentaire.
Non, si vous utilisez la "normale" méthode de mise à jour, l'ensemble de l'objet sera envoyé sur le fil.
Je soupçonne que le serveur de base de données elle-même sera assez intelligent pour ne mettre à jour l'index (et non pas ceux qui n'ont pas changé), si possible (c'est à dire, l'objet pourrait être mis en place et n'ont pas à être déplacé, car il a grandi trop)
Ce que vous pouvez faire est d'utiliser le "atomic mise à jour le modificateur" des fonctions. La documentation de Java est un peu de lumière sur eux, mais puisque le pilote transmet le JSON, l'étoffe de la non-Java tutoriels devrait fonctionner, par exemple:
Trouvé un exemple ici, ce qui semble montrer l'utilisation de l'appel de mise à jour. Donc pour ton exemple, je crois que quelque chose comme cela devrait fonctionner?
Modifier
Vous pourriez être en mesure d'utiliser une catégorie de construire votre BasicDBObjects plus groovy de la sorte...
Quelque chose comme cela pourrait le faire:
Je n'ai pas testé ce que...
Edit 2
En fait, BasicDBObject est la Carte, de sorte que vous devriez être en mesure de le faire:
sans avoir besoin de l'constructeur
Un grand nombre de réponses sur ce post utilisent des versions antérieures de la Mongo Pilote Java. Si vous utilisez une version plus récente du Pilote Java (v3.0+), puis la méthode préférée semble être d'utiliser l'objet Document au lieu de le DBObject interface.
Voici un exemple:
Cette réponse utilise le shell mongo, mais montre comment vous pouvez aller en profondeur dans un objet JSON structure pour modifier un champ spécifique sans écraser le reste.
Compte tenu de l'objet JSON dans une collection appelée "my_collection':
À la mise à jour "var_b' , sans écraser d'autre chose:
Pour mettre à jour le 3ème élément du tableau 'liste' avec la valeur '99', sans écraser d'autre chose:
Utilisez simplement les étapes ci-dessus . Vous pouvez modifier les données sans affecter d'autres éléments associés à la même clé.
//mise à jour