2016-03-07 19 views
7

Tôi đang sử dụng MongoDB 3.2 và MongoDB Java Driver 3.2. Tôi có một loạt các hàng trăm tài liệu được cập nhật cần được lưu/lưu trữ trong MongoDB. Để làm điều đó, tôi lặp qua mảng và gọi cho mỗi tài liệu trong mảng này phương thức updateOne().Cách thực hiện cập nhật hàng loạt tài liệu trong MongoDB bằng Java

Bây giờ, tôi muốn triển khai lại logic này với bản cập nhật hàng loạt. Tôi đã cố gắng tìm một ví dụ về cập nhật hàng loạt trong MongoDB 3.2 với MongoDB Java Driver 3.2.

Tôi đã thử mã này:

MongoClient mongo = new MongoClient("localhost", 27017); 
DB db = (DB) mongo.getDB("test1"); 
DBCollection collection = db.getCollection("collection"); 
BulkWriteOperation builder = collection.initializeUnorderedBulkOperation(); 
builder.find(new BasicDBObject("_id", 1001)).upsert() 
    .replaceOne(new BasicDBObject("_id", 1001).append("author", "newName")); 

builder.execute(); 

Nhưng có vẻ như phương pháp này được dựa trên một lỗi thời MongoDB Java Driver, chẳng hạn như 2.4 và sử dụng các phương pháp không dùng nữa.

Câu hỏi của tôi:
Làm thế nào để thực hiện một cập nhật hàng loạt các văn bản trong MongoDB 3.2 với MongoDB Java Driver 3.2?

+1

Nhìn vào ví dụ chi tiết https://stackoverflow.com/a/39356860/4437074 –

Trả lời

8

Sử dụng ví dụ trong cuốn hướng dẫn trên mới bulkWrite() API, hãy xem xét việc thu thập thử nghiệm sau đây, trong đó có các tài liệu sau:

{ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 }, 
{ "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 }, 
{ "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 } 

Sau đây bulkWrite() thực hiện nhiều hoạt động về thu characters:


Mongo shell:

try { 
    db.characters.bulkWrite([ 
     { 
      insertOne:{ 
       "document":{ 
        "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 
       } 
      } 
     }, 
     { 
      insertOne:{ 
       "document": { 
        "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3 
       } 
      } 
     }, 
     { 
      updateOne: { 
       "filter" : { "char" : "Eldon" }, 
       "update" : { $set : { "status" : "Critical Injury" } } 
      } 
     }, 
     { 
      deleteOne: { "filter" : { "char" : "Brisbane"} } 
     }, 
     { 
      replaceOne: { 
       "filter" : { "char" : "Meldane" }, 
       "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 } 
      } 
     } 
    ]); 
} 
catch (e) { print(e); } 

đó in kết quả:

{ 
    "acknowledged" : true, 
    "deletedCount" : 1, 
    "insertedCount" : 2, 
    "matchedCount" : 2, 
    "upsertedCount" : 0, 
    "insertedIds" : { 
     "0" : 4, 
     "1" : 5 
    }, 
    "upsertedIds" : { 

    } 
} 

Tương đương Java 3.2 thực hiện sau:

MongoCollection<Document> collection = db.getCollection("characters"); 
List<WriteModel<Document>> writes = new ArrayList<WriteModel<Document>>(); 
writes.add(
    new InsertOneModel<Document>(
     new Document("_id", 4) 
      .append("char", "Dithras") 
      .append("class", "barbarian") 
      .append("lvl", 3) 
    ) 
); 
writes.add(
    new InsertOneModel<Document>(
     new Document("_id", 5) 
      .append("char", "Taeln") 
      .append("class", "fighter") 
      .append("lvl", 4) 
    ) 
); 
writes.add(
    new UpdateOneModel<Document>(
     new Document("char", "Eldon"), // filter 
     new Document("$set", new Document("status", "Critical Injury")) // update 
    ) 
); 
writes.add(new DeleteOneModel<Document>(new Document("char", "Brisbane"))); 
writes.add(
    new ReplaceOneModel<Document>(
     new Document("char", "Meldane"), 
     new Document("char", "Tanys") 
      .append("class", "oracle") 
      .append("lvl", 4)   
    ) 
); 

BulkWriteResult bulkWriteResult = collection.bulkWrite(writes); 

Đối với câu hỏi của bạn sử dụng .210 phương pháp và điều này sẽ được thực hiện như

MongoCollection<Document> collection = db.getCollection("collection"); 
List<WriteModel<Document>> writes = Arrays.<WriteModel<Document>>asList(
    new ReplaceOneModel<Document>(
     new Document("_id", 1001), // filter 
     new Document("author", "newName"), // update 
     new UpdateOptions().upsert(true) // options 
    ) 
); 

BulkWriteResult bulkWriteResult = collection.bulkWrite(writes); 
+1

Không phải là tôi biết, nhưng [MongoDB Giới hạn và Ngưỡng] (https://docs.mongodb.org/manual/reference/limits/) vẫn áp dụng. – chridam

+1

Tuyệt vời & cảm ơn. Hai câu hỏi. 1. Có quy tắc nào khi tôi phải di chuyển từ bản cập nhật đơn lẻ sang bản cập nhật hàng loạt trong 'MongoDB' không? Tôi có nghĩa là từ số lượng tài liệu điểm quy tắc. 2. Về 'replaceOne()', tất cả các tài liệu cập nhật của tôi chứa bản cập nhật của một hai trường. Tại sao tôi nên sử dụng phương thức này chứ không phải 'updateOne()'? Theo như tôi hiểu, 'replaceOne()' thay thế toàn bộ tài liệu, trong khi 'updateOne()' chỉ có thể cập nhật giá trị của các trường cụ thể, nên nhanh hơn, tôi có đúng không? –

+1

@MikeB. Tôi nghĩ điều này đảm bảo một câu hỏi mới vì nó khác với câu hỏi ban đầu của bạn. Nếu bạn đăng một câu hỏi khác tôi sẽ là những người khác hạnh phúc để trả lời nó. Trường hợp chung ở đây là một câu hỏi một câu trả lời. Tôi có thể trả lời câu hỏi bổ sung của bạn nhưng nó hoàn toàn là một câu hỏi khác. Xin vui lòng gửi nó một cách riêng biệt. – chridam

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