[英]MongoDB JSON Document formatting
我是MongoDB的新手,在將JSON格式的文檔存儲到數據庫時遇到了一些麻煩。 我為我的應用程序提供了一個測試套件,但由於文檔的格式(我假設),我無法通過一個特定的測試。 任何幫助將不勝感激。
預先感謝,Syn
這是不斷失敗的斷言:
java.lang.AssertionError:
Expected :{ "log_set" : ["SCHEDULED", "STREAMING", "CANCELED", "FINISHED"] }
Actual :Document{{log_set=[SCHEDULED, STREAMING, CANCELED, FINISHED]}}
這是我用於插入數據的代碼:
@Override
public void loadData() throws Exception {
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
MongoDatabase database = mongoClient.getDatabase("dst");
MongoCollection<Document> collection = database.getCollection("EventData");
em.getTransaction().begin();
Query query = em.createNamedQuery(Constants.Q_ALLFINISHEDEVENTS);
List<EventImpl> finishedEvents= query.getResultList();
em.getTransaction().commit();
for(int i=0; i<finishedEvents.size(); i++){
Document toInsert = new Document("event_id",finishedEvents.get(i).getId());
toInsert.append(Constants.PROP_EVENTFINISHED,finishedEvents.get(i).getEventStreaming().getEnd().getTime());
toInsert.append(mongoTestData.getDataDescription(finishedEvents.get(i).getId()),mongoTestData.getData(finishedEvents.get(i).getId()));
System.out.println("DATE ENDED: "+finishedEvents.get(i).getEventStreaming().getEnd().getTime());
toInsert.append(Constants.PROP_EVENTFINISHED,finishedEvents.get(i).getEventStreaming().getEnd().getTime());
System.out.println("DOCUMENT TO INSERT:"+toInsert.toString());
System.out.println("DOCUMENT JSON: " +toInsert.toJson());
//collection.insertOne(toInsert);
BasicDBObject dbObject = (BasicDBObject) JSON.parse(toInsert.toJson());
collection.insertOne(new Document(dbObject));
}
}
編輯:添加了測試和測試數據:
這是測試代碼:
@Test
public void testMongoDataLoader() throws Exception {
MongoCollection<Document> collection = db.getCollection(Constants.COLL_EVENTDATA);
Map<Long, Document> docs = idMap(collection, d -> d.getLong(Constants.I_EVENT));
List<IEvent> list = daoFactory.getEventDAO().findAll();
assertFalse(list.isEmpty());
assertEquals(list.size(), docs.size());
for (IEvent relObj : list) {
assertTrue(docs.containsKey(relObj.getId()));
assertDataEquals(docs.get(relObj.getId()), relObj);
}
}
protected void assertDataEquals(Document document, IEvent relObj) {
MongoTestData mongoTestData = new MongoTestData();
assertEquals(
document.getLong(Constants.PROP_EVENTFINISHED).longValue(),
relObj.getEventStreaming().getEnd().getTime()
);
assertEquals(
document.get(mongoTestData.getDataDescription(relObj.getId())),
Document.parse(mongoTestData.getData(relObj.getId()))
);
}
這是MongoTestData:
public class MongoTestData {
public static final String DATA_DESC_LOGS = "logs";
public static final String DATA_DESC_MATRIX = "matrix";
public static final String DATA_DESC_BLOCK = "alignment_block";
private ArrayList<String> testData = new ArrayList<>();
private ArrayList<String> testDataDesc = new ArrayList<>();
public MongoTestData() {
String s1 = "{ \"log_set\" : [\"SCHEDULED\", \"STREAMING\", \"CANCELED\", \"FINISHED\"] }";
String s2 = "{ \"matrix_data\" : [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]}";
String s3 = "{ \"alignment_nr\" : 0, \"primary\" : { "
+ " \"chromosome\" : \"chr11\", \"start\" : 3001012, \"end\" : 3001075 }, \"align\" : { "
+ " \"chromosome\" : \"chr13\", \"start\" : 70568380, \"end\" : 70568443 }, \"blastz\" : 3500, "
+ "seq : [\"TCAGCTCATAAATCACCTCCTGCCACAAGCCTGGCCTGGTCCCAGGAGAGTGTCCAGGCTCAGA\", "
+ "\"TCTGTTCATAAACCACCTGCCATGACAAGCCTGGCCTGTTCCCAAGACAATGTCCAGGCTCAGA\"] }";
testData.add(s1);
testData.add(s2);
testData.add(s3);
testDataDesc.add(DATA_DESC_LOGS);
testDataDesc.add(DATA_DESC_MATRIX);
testDataDesc.add(DATA_DESC_BLOCK);
}
public String getData(Long eventId) {
return testData.get(eventId.intValue() % 3);
}
public String getDataDescription(Long eventId) {
return testDataDesc.get(eventId.intValue() % 3);
}
}
更改您的插入代碼,以將數據(而不是原始json字符串)作為Document
(鍵值對)插入。
更新到下面的for loop
代碼。 請注意Document.parse
的使用
for(int i=0; i<finishedEvents.size(); i++){
Document toInsert = new Document("event_id", finishedEvents.get(i).getId());
toInsert.append(Constants.PROP_EVENTFINISHED, finishedEvents.get(i).getEventStreaming().getEnd().getTime());
toInsert.append(mongoTestData.getDataDescription(finishedEvents.get(i).getId()), Document.parse(mongoTestData.getData(finishedEvents.get(i).getId())));
collection.insertOne(toInsert);
}
看來您的測試工具正在使用JSON,但正在獲取一個Document實例。 由於這兩個不嚴格相等,因此比較失敗。 所以我想說這可能是您的測試工具或您如何使用它的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.