Comment puis-je insérer des données dans la collection mongodb avec le pilote Java?
J'essaye (avec une collection vide):
db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);
Mais le document a été créé avec _id == ObjectID (...). Pas avec la valeur "12".
Ce code (js) ajoute le document avec _id = "12" comme prévu
db.metaclass.update(
{ _id:12},
{
$set: {b:1}
},
{ upsert: true }
)
mongo-Java-driver-2.11.2
Vous ne pouvez pas définir _id
if dbobject
est juste un document et ne contient pas d'opérateur de mise à jour, par exemple: $set
, $setOnInsert
.
Le simple fait de passer un document remplacera tout le document, ce qui signifie qu'il ne définit pas de _id
a revient à ObjectId
Donc, votre exemple fonctionne si vous utilisez un opérateur de mise à jour, par exemple:
db.getCollection(collection).update(
new BasicDBObject("_id", "12"),
new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)
Si vous utilisez mongo-Java driver , en suivant la méthode .updateOne()
avec {upsert, true}
flag fonctionne.
void setLastIndex(MongoClient mongo, Long id, Long lastIndexValue) {
Bson filter = Filters.eq("_id", id);
Bson update = new Document("$set",
new Document()
.append("lastIndex", lastIndexValue)
.append("created", new Date()));
UpdateOptions options = new UpdateOptions().upsert(true);
mongo.getDatabase(EventStreamApp.EVENTS_DB)
.getCollection(EventCursor.name)
.updateOne(filter, update, options);
}
This is to upsert with scala driver which i couldnot find in web
con.updateOne(
equal("vendor_id", vendorId),
inc("views_count", f.views),
UpdateOptions().upsert(true))
to do so import the following
import org.mongodb.scala.model.UpdateOptions
Vous pouvez utiliser la méthode replaceOne
et spécifier le ReplaceOptions
(depuis 3.7):
private static final ReplaceOptions REPLACE_OPTIONS
= ReplaceOptions.createReplaceOptions(new UpdateOptions().upsert(true));
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, REPLACE_OPTIONS);
Pour les versions plus anciennes, vous pouvez passer directement la UpdateOptions
à la méthode replaceOne:
private static final UpdateOptions UPDATE_POLICY = new UpdateOptions().upsert(true);
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, UPDATE_POLICY);
Comme mentionné dans la documentation :
replaceOne () remplace le premier document correspondant de la collection qui correspond au filtre, en utilisant le document de remplacement.
Si upsert: true et qu'aucun document ne correspond au filtre, replaceOne () crée un nouveau document basé sur le document de remplacement.