2016-09-28 1 views
0

Ich bin nur mein Projekt von der alten 2,13 auf den neuen 3.3 Java-Treiber ändern. Jetzt, da Document sowieso DBObject ersetzen wird, dachte ich, ich würde es ersetzen. Alles funktioniert wie ein Zauber ... außer, dass die (alte) DB die Dokumente nicht akzeptiert, die ich darauf werfen will.Dokument vs DBObject Verwirrung beim Verschieben von Java MongoDb-Treiber 2.13 bis 3.3

Sollte nicht einfügenOne akzeptieren Sie die org.bson.Document einfach gut, da es zuvor DBObject nahm?

werden Eigene Dateien wie folgt aufgebaut:

static synchronized Document CommentsToDocument(Comment comment) { 
    return new Document().append("source", comment.getSource()).append("date", comment.getDateTime()) 
      .append("author", comment.getAuthor()).append("thread", comment.getThreadID()) 
      .append("commentID", comment.getCommentID()).append("title", comment.getTitle()) 
      .append("comment", comment.getComment()); 
} 

static synchronized Document UrlsToDocument(String url, int counter) { 
    return new Document("url", url).append("count", counter); 
} 

Diese Dokumente werden dann zu einem deque hinzugefügt. Und sollte wie folgt eingefügt:

static synchronized void writeToDb(String col, ConcurrentLinkedDeque<Document> comments) { 
    MongoCollection<Document> collection = database.getCollection(col); 
    for (Document o : comments) { 
     collection.insertOne(o); 
    } 
} 

Ja, ich weiß, das writeToDb eher unelegant ist, und ich werde eine bessere Art und Weise trainieren. ;)

Vorerst stehe ich nur vor dem Problem, dass die DB, die BasiDBObjects gleicher Zusammensetzung gut akzeptiert, die Dokumente nicht akzeptiert.

Sind die Objekte intern als BasicDBObjects gespeichert, so dass ich zuerst die Dokumente analysieren muss? Oder gibt es eine Möglichkeit, die DB dazu zu bringen, die Dokumente so zu akzeptieren, wie sie sind, wobei die DB sie intern analysiert?

Oder muss ich alle Objekte aus der alten Datenbank lesen, eine neue erstellen und sie nach dem Reparieren zurückschreiben? o.O

Vielen Dank für Ihren Rat.

PS: Ich habe die CRUD Operations info bereits gelesen, konnte aber keinen Grund finden, warum es meine Document Objects nicht gut akzeptieren würde. Ich bin wahrscheinlich unerfahren, um das Offensichtliche zu sehen, also ja. ;)

PPS: Interessanterweise kann ich Dokumente gut lesen. Der einzige Unterschied zwischen den Dokumenten, die ich heraushole und versuche hineinzukommen, ist das Fehlen von _id ... was kein Problem sein sollte. Ich habe auch die Möglichkeit eines Indexproblems untersucht, aber die URL-Sammlung wird nur über die URL eindeutig indiziert (und die _id natürlich) und sollte neue (abweichende) Einträge akzeptieren.

+0

Haben Sie eine Ausnahme beim Einfügen der Daten in Mongo –

+0

Nein, leider nicht. Versucht, Informationen auf diese Weise bereits zu bekommen. Nicht einmal wenn ich die insertOne direkt mit try/Catch umgab, bekam ich einen Stacktrace. Es scheint, dass das Dokument korrekt an die DB übergeben wurde, aber "passt nicht zur Rechnung". –

+0

Was meinen Sie mit "akzeptiert nicht die Dokumente"? Was sind die Symptome? Ausnahmen? Dokument wird einfach nicht angezeigt? Im Allgemeinen speichert die Datenbank einen bestimmten Typ von Dokumenten nicht. In der Datenbank selbst ist alles nur komprimierte json. Die Klassen DBObject/BasicDBObject/Document sind nur Abstraktionen auf der Treiberseite und * sollte * frei austauschbar sein. – mtj

Antwort

0

Die Lösung gefunden. Anscheinend wurde ein Bool-Flag auf einem komplett anderen Teil des Codes zurückgesetzt. Ihre Fragen zu den Ausnahmen führen mich auf den richtigen Weg, da es NON gab. Was bedeutete, dass es überhaupt kein DB-Problem gab. Der DB zuckte korrekt mit allen Dokumenten, die er bereits in seinem Index hatte.