使用mongodb java驱动程序的第3版(特别是v3.0.1)来备份文档的惯用方法是什么?
我们有会话集合,当创建或修改新会话时,我们希望在一个操作中将其挂起 - 而不是必须查询文档是否存在,然后插入或替换。
我们的旧upsertion代码使用了scala驱动程序casbah 2.7.3。看起来像是:
import com.mongodb.casbah.MongoCollection
import com.mongdb.DBObject
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: DBObject = ... // Either create a new one, or find and modify an existing one
sessionCollection.update(
"_id" -> sessionKey,
sessionDocument
upsert = true
)
在我们当前的项目中,我们只使用普通的java 3.0.1驱动程序,而我们使用BsonDocument
代替DBObject
来使其更具典型性。我尝试用以下内容替换上面的内容:
import com.mongodb.client.MongoCollection
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: BsonDocument = // Either create a new one, or find and modify an existing one
val updateOptions = new UpdateOptions
updateOptions.upsert(true)
sessionCollection.updateOne(
"_id" -> new BsonString(sessionKey),
sessionDocument,
updateOptions
)
这会抛出错误“java.lang.IllegalArgumentException:BSON字段名称无效...”。错误包含在this question中,但该问题中的操作并未尝试在一个操作中进行upup - 他们使用上下文来决定是否替换/更新/插入等...
我对scala或java中的代码示例感到满意。
谢谢!
答案 0 :(得分:13)
在Mongo Java Driver 3.0系列中,我们添加了一个新的Crud API,它更加明确,因此对初学者友好。该计划已在多个MongoDB驱动程序中推出,但与旧API相比确实包含了一些变化。
由于您没有使用update operator更新现有文档,因此updateOne
方法不合适。
您描述的操作是replaceOne
操作,可以这样运行:
sessionCollection.replaceOne(
"_id" -> new BsonString(sessionKey),
sessionDocument,
(new UpdateOptions()).upsert(true)
)