如何使用mongodb-java-driver进行upsert

use*_*837 18 java upsert mongodb

如何使用java-driver将数据插入mongodb集合?

我尝试(空收集):

db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);
Run Code Online (Sandbox Code Playgroud)

但文档是使用_id == ObjectID(...)创建的.不是"12"值.

此代码(js)按预期添加_id ="12"的文档

db.metaclass.update(
   { _id:12},
   {
     $set: {b:1}
   },
   { upsert: true }
)
Run Code Online (Sandbox Code Playgroud)

蒙戈-java的驱动程序2.11.2

pra*_*upd 19

如果您使用的是mongo-java驱动程序3,则以下.updateOne()带有{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);
  }
Run Code Online (Sandbox Code Playgroud)


Ros*_*oss 17

您不能设置_idif dbobject是否只是一个文档而不包含更新运算符,例如:$set,$setOnInsert.

只是传递一个文档将替换整个文档意味着它没有设置_id回落ObjectId

因此,如果您使用更新运算符,您的示例将起作用:

db.getCollection(collection).update(
    new BasicDBObject("_id", "12"), 
    new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)
Run Code Online (Sandbox Code Playgroud)