2015-06-03 13 views
9

cách thành ngữ để upsert một tài liệu bằng cách sử dụng phiên bản 3 của trình điều khiển java mongodb (cụ thể là v3.0.1) là gì?Làm thế nào để upsert tài liệu trong trình điều khiển Java MongoDB 3

Chúng tôi có một bộ sưu tập cho phiên và khi phiên mới được tạo hoặc sửa đổi, chúng tôi muốn nâng cấp nó trong một thao tác - thay vì phải truy vấn nếu tài liệu tồn tại và sau đó chèn hoặc thay thế.

Mã lỗi nâng cấp cũ của chúng tôi đã sử dụng trình điều khiển scala 2.7.3. Nó trông giống như:

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 
) 

Trong dự án hiện tại của chúng tôi chúng tôi chỉ sử dụng đồng bằng lái xe java 3.0.1 và chúng tôi đang sử dụng BsonDocument thay vì DBObject để làm cho nó typsafe hơn. Tôi đã cố gắng thay thế các điều trên bằng một cái gì đó như:

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 
) 

Điều này sẽ ném lỗi "java.lang.IllegalArgumentException: Invalid field field BSON ...". Lỗi này được bao gồm trong this question nhưng câu hỏi trong câu hỏi đó không cố gắng nâng lên trong một thao tác - họ đang sử dụng ngữ cảnh để quyết định có thay thế/cập nhật/chèn v.v ...

Tôi hài lòng với các mẫu mã trong scala hoặc java.

Cảm ơn!

Trả lời

11

Trong loạt trình điều khiển Java Mongo 3.0, chúng tôi đã thêm một API Crud mới rõ ràng hơn và do đó thân thiện với người mới bắt đầu. Sáng kiến ​​này đã được triển khai trên một số trình điều khiển MongoDB nhưng nó có chứa một số thay đổi so với API cũ hơn.

Vì bạn không cập nhật tài liệu hiện có bằng cách sử dụng update operator, phương pháp updateOne không phù hợp.

Các hoạt động mà bạn mô tả là một hoạt động replaceOne và có thể được chạy như vậy:

sessionCollection.replaceOne(
    "_id" -> new BsonString(sessionKey), 
    sessionDocument, 
    (new UpdateOptions()).upsert(true) 
) 
+0

cảm ơn vì sự giúp đỡ. Tôi nghĩ rằng mặc dù những gì bạn đang đề xuất không phải là những gì tôi sau. Tôi muốn một hoạt động chèn một phiên mới nếu không tồn tại với id đó, hoặc cập nhật phiên hiện tại nếu nó tồn tại (ví dụ: "upsertion"). 'replaceOne' chỉ làm cái sau. Khi tôi sử dụng đoạn mã của bạn để thử và chèn một phiên mới vào cơ sở dữ liệu, nó sẽ tự động trả về 'AcknowledgedUpdateResult {matchedCount = 0, modifiedCount = null, upsertedId = null}' và không có hiệu lực trên cơ sở dữ liệu. – rmin

+1

Hãy chắc chắn rằng bạn thiết lập upserted trong updateOptions, tôi đã làm rõ ví dụ. Khi bạn không cập nhật thông qua một nhà điều hành cập nhật, nhưng thay vì đang làm một upsert thay thế thì bạn cần phương thức 'replaceOne'. – Ross

+2

Cảm ơn Ross! Nó hoạt dộng bây giờ. Nếu câu trả lời của bạn có nghĩa là mã scala, bạn có thể đặt các dấu ngoặc quanh 'UpdateOptions' mới - tức là. thay đổi nó thành '(updateOptions mới) .upsert (true)'. Nếu không nó không biên dịch. – rmin

Các vấn đề liên quan