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!
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
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
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