2013-08-08 29 views
27

Tôi đang sử dụng MongoDB trong ứng dụng của mình và cần thiết để chèn nhiều tài liệu bên trong một bộ sưu tập MongoDB. Phiên bản tôi đang sử dụng là 1,6Cách chèn nhiều tài liệu cùng một lúc trong MongoDB qua Java

Tôi thấy một ví dụ ở đây

http://docs.mongodb.org/manual/core/create/

trong

Bulk Insert Nhiều Documents Mục

Đối với tác giả đã đi qua một mảng để làm điều này.

Khi tôi cố gắng tương tự, nhưng tại sao nó không cho phép và vui lòng cho tôi biết cách tôi có thể chèn nhiều tài liệu cùng một lúc ??

package com; 

import java.util.Date; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.MongoClient; 

public class App { 

    public static void main(String[] args) { 
     try { 
      MongoClient mongo = new MongoClient("localhost", 27017); 
      DB db = mongo.getDB("at"); 
      DBCollection collection = db.getCollection("people"); 

      /* 
      * BasicDBObject document = new BasicDBObject(); 
      * document.put("name", "mkyong"); document.put("age", 30); 
      * document.put("createdDate", new Date()); table.insert(document); 
      */ 

      String[] myStringArray = new String[] { "a", "b", "c" }; 

      collection.insert(myStringArray); // Compilation error at this line saying that "The method insert(DBObject...) in the type DBCollection is not applicable for the arguments (String[])" 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Vui lòng cho tôi biết cách để tôi có thể chèn nhiều tài liệu cùng một lúc thông qua java.

+0

Bạn có thể có một cái nhìn tại phản ứng của tôi trong thread khác .. http://stackoverflow.com/questions/31470702/bulk-upsert-with-mongodb-java-3-0-driver/39356860 # 39356860 –

Trả lời

38

DBCollection.insert chấp nhận thông số loại DBObject, List<DBObject> hoặc một mảng DBObject s để chèn nhiều tài liệu cùng một lúc. Bạn đang đi qua trong một mảng chuỗi.

Bạn phải điền thủ công tài liệu (DBObject s), chèn chúng vào List<DBObject> hoặc một mảng DBObject s và cuối cùng là insert chúng.

DBObject document1 = new BasicDBObject(); 
document1.put("name", "Kiran"); 
document1.put("age", 20); 

DBObject document2 = new BasicDBObject(); 
document2.put("name", "John"); 

List<DBObject> documents = new ArrayList<>(); 
documents.add(document1); 
documents.add(document2); 
collection.insert(documents); 

Đoạn trên là cơ bản giống như các lệnh bạn sẽ phát hành trong vỏ MongoDB:

db.people.insert([ {name: "Kiran", age: 20}, {name: "John"} ]); 
+0

cảm ơn, là có cách nào khác để làm điều này, tôi đoán việc tạo ra quá nhiều DBObject sẽ là probmalitic như tôi cần phải tạo gần 100.so là có cách nào khác cho điều này? – Kiran

+1

Tôi không chắc chắn về các cách khác, nhưng sử dụng [MongoOperations.insert()] của Dữ liệu Spring (http://static.springsource.org/spring-data/data-mongodb/docs/1.1.0.M1/api/) , bạn có thể loại bỏ phần tạo ra 'DBObject' (Spring làm nó cho bạn). –

+0

Làm cách nào chúng ta có thể thực hiện điều này thông qua API dữ liệu Spring Mongo? Cảm ơn, Deepa – Prateek

17

Tính đến MongoDB 2.6 và 2.12 phiên bản của trình điều khiển bạn cũng có thể bây giờ làm một bulk insert operation. Trong Java, bạn có thể sử dụng BulkWriteOperation. Việc sử dụng ví dụ của việc này có thể là:

DBCollection coll = db.getCollection("user"); 
BulkWriteOperation bulk = coll.initializeUnorderedBulkOperation(); 
bulk.find(new BasicDBObject("z", 1)).upsert().update(new BasicDBObject("$inc", new BasicDBObject("y", -1))); 
bulk.find(new BasicDBObject("z", 1)).upsert().update(new BasicDBObject("$inc", new BasicDBObject("y", -1))); 
bulk.execute(); 
18

Trước 3.0, bạn có thể sử dụng dưới mã trong Java

DB db = mongoClient.getDB("yourDB"); 
      DBCollection coll = db.getCollection("yourCollection"); 
      BulkWriteOperation builder = coll.initializeUnorderedBulkOperation(); 
      for(DBObject doc :yourList) 
      { 
       builder.insert(doc); 
      } 
      BulkWriteResult result = builder.execute(); 
      return result.isAcknowledged(); 

Nếu bạn đang sử dụng MongoDB phiên bản 3.0, bạn có thể sử dụng

MongoDatabase database = mongoClient.getDatabase("yourDB"); 
      MongoCollection<Document> collection = database.getCollection("yourCollection"); 
      collection.insertMany(yourDocumentList); 
1

Định dạng bản ghi chèn của bạn như trong MongoDB mà truy vấn nghỉ hưu từ bất kỳ nguồn nào EG.

{ 
    "_id" : 1, 
    "name" : a 
} 
{ 
    "_id" : 2, 
    "name" : b, 
} 

nó là mongodb 3.0

FindIterable<Document> resulutlist = collection.find(query);    
List docList = new ArrayList(); 
for (Document document : resulutlist) { 
    docList.add(document); 
} 

if(!docList.isEmpty()){ 
    collectionCube.insertMany(docList); 
} 
2

Tạo Tài liệu

Có hai lệnh chính để tạo tài liệu trong MongoDB:

  • insertOne()
  • insertMany()

Như vậy là những cách khác như cũng như Update lệnh. Chúng tôi gọi những hoạt động này, up up. Upserts xảy ra khi không có tài liệu nào khớp với bộ chọn chọn được sử dụng để xác định tài liệu.

Mặc dù MongoDB chèn ID theo chính nó, Chúng tôi cũng có thể chèn ID tùy chỉnh theo cách thủ công bằng cách chỉ định tham số _id trong các hàm insert...().

Để chèn nhiều tài liệu, chúng tôi có thể sử dụng insertMany() - có một mảng tài liệu làm tham số. Khi được thực hiện, nó trả về nhiều id s cho mỗi tài liệu trong mảng. Để xóa bộ sưu tập, hãy sử dụng lệnh drop(). Đôi khi, khi chèn số lượng lớn - chúng tôi có thể chèn các giá trị trùng lặp. Cụ thể, nếu chúng ta cố gắng chèn trùng lặp _id s, chúng tôi sẽ nhận được duplicate key error:

 

db.startup.insertMany(
    [ 
    {_id:"id1", name:"Uber"}, 
    {_id:"id2", name:"Airbnb"}, 
    {_id:"id1", name:"Uber"}, 
    ] 
); 

MongoDB duplicate key error

MongoDB dừng chèn hoạt động, nếu nó gặp một lỗi, để đàn áp đó - chúng tôi có thể cung cấp ordered:false tham số . Ví dụ:

 

db.startup.insertMany(
[ 
{_id:"id1", name:"Uber"}, 
{_id:"id2", name:"Airbnb"}, 
{_id:"id1", name:"Airbnb"}, 
], 
{ordered: false} 
);