簡體   English   中英

MongoDB JSON文檔格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM