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

时间:2013-06-26 11:54:42

标签: java mongodb upsert

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

我尝试(空收集):

db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);

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

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

db.metaclass.update(
   { _id:12},
   {
     $set: {b:1}
   },
   { upsert: true }
)

蒙戈-java的驾驶员2.11.2

4 个答案:

答案 0 :(得分:19)

如果您使用的是mongo-java driver 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);
  }

答案 1 :(得分:17)

如果_id只是一个文档且不包含更新运算符,则无法设置dbobject,例如:$set$setOnInsert

只是传递文档会替换整个文档,这意味着它不会将_id设置为ObjectId

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

db.getCollection(collection).update(
    new BasicDBObject("_id", "12"), 
    new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)

答案 2 :(得分:0)

您可以使用replaceOne方法并指定ReplaceOptions(从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);

对于旧版本,您可以直接将UpdateOptions传递给replaceOne方法:

private static final UpdateOptions UPDATE_POLICY = new UpdateOptions().upsert(true);
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, UPDATE_POLICY);  

documentation中所述:

  

replaceOne()替换集合中的第一个匹配文档   使用替换文档与过滤器匹配。

     

如果upsert:true,并且没有文档与过滤器匹配,请替换One()   根据替换文档创建一个新文档。

答案 3 :(得分:0)

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