2015-01-26 2 views
5

Я пытаюсь вставить строку, которая представляет собой массив JSON в коллекцию MongoDB с этимВставьте JSON массив в MongoDB

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

Но я получаю исключение,

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

кто показать мне правильный способ сделать это?

+0

Нормально ли, что у вас одинаковый идентификатор везде? я не думаю, что это настоящая причина, но это странно. – vincent

+0

@vincent. Я редактировал код. Несмотря на то, что идентификаторы разные, такая же ошибка существует. – noob

+1

вам нужно сохранить один документ с массивом или несколькими документами? – injecteer

ответ

1

согласно java docinsert() может принимать либо один DBObject, либо массив или List из них.

Таким образом, в целях экономии, вам необходимо преобразовать массив JSON в массив/Список DBObjects или сохранить элемент каждого массива

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

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. –

0

Я нашел хороший способ для достижения этой цели:

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

у меня была проблема с этим, потому что мне нужно приложить к этому документу свойство, которое является Json Массив:

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

Но проблема в том, что Document.parse() не работает с массивами, поэтому я мог бы решить его, используя указанную выше строку. Таким образом, окончательный код:

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

И он отлично работает. Да, я знаю, что существуют более эффективные способы сделать это, но на данный момент я использую это.

Жду, что это будет полезно для кого-то с той же проблемой.