Java MongoDB JSON文档格式

Java MongoDB JSON文档格式,java,json,mongodb,Java,Json,Mongodb,我是MongoDB新手,在将JSON格式的文档存储到数据库时遇到了一些问题。我为我的应用程序提供了一个测试套件,但我无法通过一个特定的测试,因为我的文档的格式(我假设)。 任何帮助都将不胜感激 提前感谢,, Syn 这是一个不断失败的断言: java.lang.AssertionError: Expected :{ "log_set" : ["SCHEDULED", "STREAMING", "CANCELED", "FINISHED"] } Actual :Document{{log_s

我是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));
    }
}
@覆盖
public void loadData()引发异常{
MongoClient MongoClient=新的MongoClient(“本地主机”,27017);
MongoDatabase数据库=mongoClient.getDatabase(“dst”);
MongoCollection collection=database.getCollection(“EventData”);
em.getTransaction().begin();
Query Query=em.createNamedQuery(Constants.Q_ALLFINISHEDEVENTS);
List finishedEvents=query.getResultList();
em.getTransaction().commit();
对于(int i=0;id.getLong(Constants.i_事件));
List List=daoFactory.getEventDAO().findAll();
assertFalse(list.isEmpty());
assertEquals(list.size(),docs.size());
对于(IEvent relObj:列表){
assertTrue(docs.containsKey(relObj.getId());
assertDataEquals(docs.get(relObj.getId()),relObj);
}
}
受保护的无效资产数据相等(文档文档,IEvent relObj){
MongoTestData MongoTestData=新的MongoTestData();
资产质量(
document.getLong(Constants.PROP\u EVENTFINISHED).longValue(),
relObj.getEventStreaming().getEnd().getTime()
);
资产质量(
get(mongoTestData.getDataDescription(relObj.getId()),
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);
    }
}
公共类MongoTestData{
公共静态最终字符串数据\u DESC\u LOGS=“LOGS”;
公共静态最终字符串数据\u DESC\u MATRIX=“MATRIX”;
公共静态最终字符串数据\u DESC\u BLOCK=“对齐\u BLOCK”;
private ArrayList testData=new ArrayList();
private ArrayList testDataDesc=new ArrayList();
公共MongoTestData(){
字符串s1=“{\'日志集\':[\'计划\',\'流式处理\',\'取消\',\'完成\']}”;
字符串s2=“{\'矩阵_数据\”:[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]};
字符串s3=“{\'alignment\u nr\”:0,\'primary\:{”
+“\“染色体\:\“chr11\”,“开始\”:3001012,\“结束\”:3001075},\“对齐\”:{”
+“‘染色体’:‘chr13’,‘开始’:70568380,‘结束’:70568443},‘blastz’:3500,”
+“序号:[\'TCAGCTCAAATCACTCGCTCGCTCGCCCAGCCTGGTCCCAGCAGAGAGTCGCTCAGCTCAGA\”,”
+“\“TCTGTTCATAACCACTGCCATGAGCGGCCTGTTCCAGAGACATGCCAGA\”];
testData.add(s1);
testData.add(s2);
testData.add(s3);
添加(数据描述日志);
添加(数据描述矩阵);
添加(数据描述块);
}
公共字符串getData(长事件ID){
返回testData.get(eventId.intValue()%3);
}
公共字符串getDataDescription(长事件ID){
返回testDataDesc.get(eventId.intValue()%3);
}
}

您的测试工具似乎需要JSON,但它得到了一个文档实例。由于这两个数字并非严格相等,因此比较失败。所以我想说,这可能是您的测试工具或您如何使用它的问题

您的测试工具似乎需要JSON,但它得到了一个文档实例。由于这两个数字并非严格相等,因此比较失败。所以我想说,这可能是您的测试工具或您如何使用它的问题

更改插入代码以将数据插入为
文档(键值对),而不是原始json字符串

将循环的
代码更新到下面。请注意
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);
 }

for(int i=0;i更改插入代码以将数据作为
文档插入(键值对),而不是原始json字符串

将循环的
代码更新到下面。请注意
文档的用法。解析

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);
 }

for(int i=0;iI对MongoDB不太了解,但似乎数据应该直接插入,而不是嵌套在文档中。您可以添加测试用例吗?@Veeram i添加了测试用例以及运行测试的一些数据。我看到您已经注释掉了
collection.insertOne(toInsert)
。在我看来,这是正确的。您在注释代码时遇到了什么问题?与我现在遇到的问题完全相同。在完成整个
JSON.parse(toInsert.toJson())之前,我最初也是这么想的
thing。我对MongoDB不太了解,但似乎数据应该直接插入,而不是嵌套在文档中。您可以添加测试用例吗?@Veeram我添加了测试用例以及运行测试的一些数据。我看到您已经注释掉了
collection.insertOne(toInsert)
。在我看来,这是正确的。您在注释代码时遇到了什么问题?与我现在遇到的问题完全相同。在完成整个
JSON.parse(toInsert.toJson())之前,我最初也是这么想的
thing。提供了测试套件,我只负责实现,因此我无法更改测试。更新的答案。请验证。提供了测试套件,我只负责实现,因此我无法更改测试。更新的答案。请验证。