如何使用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
答案 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