web-dev-qa-db-fra.com

Comment effectuer un upsert avec mongodb-Java-driver

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

18
user1312837

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)
17
Ross

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);
  }
19
prayagupd
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
0
chandu

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.

0
M3HD1