2015-01-26 20 views
5

Tôi đang cố gắng để chèn một chuỗi đại diện cho một mảng JSON thành một bộ sưu tập MongoDB với điều này,Chèn JSON Mảng vào MongoDB

String str = "[{\"id\":1,\"data\":\"data1\"},{\"id\":2,\"data\":\"data2\"},{\"id\":3,\"data\":\"data3\"}]"; 
DBObject dbObject = (DBObject) JSON.parse(str); 
collection.insert(dbObject); 

Nhưng tôi nhận được ngoại lệ,

Exception in thread "main" java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [_id] 

thể bất cứ ai chỉ cho tôi cách chính xác để làm điều này?

+0

bình thường bạn có cùng một id ở mọi nơi? Tôi không nghĩ rằng đó là lý do thực sự nhưng nó là lạ – vincent

+0

@vincent Tôi đã chỉnh sửa mã. Mặc dù các id khác nhau, cùng một lỗi là ở đó .. – noob

+1

bạn có cần lưu một tài liệu đơn lẻ với một mảng hay một vài tài liệu không? – injecteer

Trả lời

1

theo java doc số insert() có thể chấp nhận đơn lẻ DBObject hoặc một mảng hoặc List trong số đó.

Vì vậy, để tiết kiệm, bạn cần phải chuyển đổi mảng JSON của bạn thành một mảng/Danh sách DBObjects, hoặc lưu mục của mỗi mảng

1
String json = "[{\"id\":1,\"data\":\"data1\"},{\"id\":2,\"data\":\"data2\"},{\"id\":3,\"data\":\"data3\"}]"; 
    MongoCredential credential = MongoCredential.createCredential("root", "sample", "root".toCharArray()); 
    MongoClient mongoClient = new MongoClient(new ServerAddress("localhost"), Arrays.asList(credential)); 
    MongoDatabase db = mongoClient.getDatabase("sample"); 
    MongoCollection<Document> collection = db.getCollection("loginTracking"); 
    List<Document> jsonList = new ArrayList<Document>(); 
    net.sf.json.JSONArray array = net.sf.json.JSONArray.fromObject(json); 
    for (Object object : array) { 
     net.sf.json.JSONObject jsonStr = (net.sf.json.JSONObject) JSONSerializer.toJSON(object); 
     Document jsnObject = Document.parse(jsonStr.toString()); 
     jsonList.add(jsnObject); 

    } 
    collection.insertMany(jsonList); 
    mongoClient.close(); 
+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và/hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó. –

0

Tôi tìm thấy một cách tốt để đạt được điều đó:

(ArrayList<Document>) JSON.parse("[String json array]"); 

tôi đã có một vấn đề với điều này, bởi vì tôi cần thêm tài liệu này một tài sản mà là một mảng JSON:

Document objAddendumVersion = new Document(); 
objAddendumVersion.append("_id", new ObjectId()); 
objAddendumVersion.append("Array", My Array here!); 

Nhưng vấn đề là Document.parse() không hoạt động với Mảng, vì vậy tôi có thể giải quyết nó bằng cách sử dụng dòng trên. Vì vậy, mã cuối cùng là:

Document objAddendumVersion = new Document(); 
objAddendumVersion.append("_id", new ObjectId()); 
objAddendumVersion.append("Array", (ArrayList<Document>) JSON.parse("[String json array]")); 

Và nó hoạt động hoàn hảo. Có, tôi biết rằng tồn tại những cách tốt hơn để làm điều đó, nhưng cho thời điểm này tôi đang sử dụng này.

Tôi chờ đợi điều đó sẽ hữu ích cho người có cùng sự cố.

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