2015-01-26 20 views
5

Sto cercando di inserire una stringa che rappresenta una matrice JSON in una collezione MongoDB con questo,Inserisci JSON Array in mongodb

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

Ma ho l'eccezione,

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

chiunque mostrami il modo corretto di farlo?

+0

è normale che tu abbia lo stesso id ovunque? non penso che sia la vera ragione ma è strano – vincent

+0

@vincent Ho modificato il codice. Anche se gli ID sono diversi, c'è lo stesso errore. – noob

+1

è necessario salvare un singolo documento con un array o più documenti? – injecteer

risposta

1

come da java doc il insert() può accettare il singolo DBObject o un array o List di essi.

Così, al fine di risparmiare, è necessario convertire l'array JSON in un array/Elenco dei DBObjects, o salvare un oggetto da ogni matrice

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

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e/o su come questo codice risponde alla domanda migliora il suo valore a lungo termine. –

0

ho trovato un buon modo per raggiungere questo obiettivo:

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

ho avuto un problema con questo, perché ho bisogno di aggiungere a questo documento una proprietà che è un array JSON:

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

Ma il problema è che Document.parse() non funziona con gli array, quindi potrei risolverlo usando la linea sopra. Quindi il codice finale è:

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

E funziona perfettamente. Sì, so che esistono modi migliori per farlo, ma per il momento sto usando questo.

Aspetto che sia utile per qualcuno con lo stesso problema.