如何在MongoDB Java驱动程序3中插入文档

rmi*_*min 10 java scala mongodb casbah mongodb-java

使用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
)
Run Code Online (Sandbox Code Playgroud)

在我们当前的项目中,我们只是使用普通的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
)
Run Code Online (Sandbox Code Playgroud)

这会抛出错误"java.lang.IllegalArgumentException:无效的BSON字段名称......".这个问题涵盖了这个错误,但该问题中的操作并不是试图在一个操作中插入 - 他们使用上下文来决定是否替换/更新/插入等...

我对scala或java中的代码示例感到满意.

谢谢!

Ros*_*oss 13

在Mongo Java Driver 3.0系列中,我们添加了一个新的Crud API,它更加明确,因此对初学者友好.这个计划已经在许多MongoDB驱动程序上推出,但它确实包含了与旧API相比的一些变化.

由于您没有使用更新运算符更新现有文档,因此该updateOne方法不合适.

您描述的replaceOne操作是一个操作,可以像这样运行:

sessionCollection.replaceOne(
    "_id" -> new BsonString(sessionKey),
    sessionDocument,
    (new UpdateOptions()).upsert(true)
)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢罗斯!它现在有效.如果您的答案是scala代码,可以在"新的UpdateOptions"周围添加括号 - 即.将其更改为`(new UpdateOptions).upsert(true)`.否则它不会编译. (2认同)