example - Como cambiar con mongodb-java-driver
pom mongodb driver (3)
No puede configurar _id
si dbobject
es solo un documento y no contiene un operador de actualización, por ejemplo: $set
, $setOnInsert
.
El _id
hecho de pasar un documento reemplazará a todo el documento, lo que significa que no establece que _id
a recaiga en ObjectId
Así que su ejemplo funciona si usa un operador de actualización, por ejemplo:
db.getCollection(collection).update(
new BasicDBObject("_id", "12"),
new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)
¿Cómo puedo insertar datos en la colección mongodb con java-driver?
Lo intento (con la colección vacía):
db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);
Pero el documento fue creado con _id == ObjectID (...). No con el valor "12".
Este código (js) agrega documento con _id = "12" como se esperaba
db.metaclass.update(
{ _id:12},
{
$set: {b:1}
},
{ upsert: true }
)
mongo-java-driver-2.11.2
Puede utilizar el método replaceOne
y especificar las ReplaceOptions
(desde 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);
Para versiones anteriores, puede pasar directamente las UpdateOptions
al método replaceOne:
private static final UpdateOptions UPDATE_POLICY = new UpdateOptions().upsert(true);
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, UPDATE_POLICY);
Como se menciona en la documentation :
replaceOne () reemplaza el primer documento coincidente en la colección que coincide con el filtro, usando el documento de reemplazo.
Si upsert: true y ningún documento coincide con el filtro, replaceOne () crea un nuevo documento basado en el documento de reemplazo.
Si está utilizando el controlador mongo-java 3 , sigue el método .updateOne()
con el {upsert, true}
.
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);
}