2017-07-03 3 views
1

Ich benutze mongodb Java-Treiber 3.4.Abrufen von Daten mit mongodb Java-Treiber 3.4 mit find() - Methode mit Projektion

In den mongodb Datenbankdokumente werden nach der folgenden Struktur gespeichert:

{ 
    "_id" : ObjectId("595a9fc4fe3f36402b7edf0e"), 
    "id" : "123", 
    "priceInfo" : [ 
     {object1: value1}, {object2: value2}, {object3: value3} 
    ] 
} 

Um die „PREISInfoEUR“ -Array eines Dokuments mit einer bestimmten ID abzurufen, ich den folgenden Code geschrieben:

collection.find(eq("id", id)).first().projection(fields(include("priceInfo"), excludeId())); 

ich schrieb diesen Code auch in der Dokumentation nach, die Sie hier finden können:

http://mongodb.github.io/mongo-java-driver/3.4/javadoc/?com/mongodb/client/model/Projections.html

Das Problem ist, dass meine IDE diesen Code nicht akzeptiert.

Es gibt mir die folgende Fehlermeldung:

enter image description here

Ich habe keine Ahnung, warum dieser Code funktioniert nicht. Zuerst schlug die IDE vor, mehrere Klassen zu integrieren - was ich tat. Aber danach habe ich immer noch eine Fehlermeldung, nämlich die, die du oben siehst.

Was ist falsch an dem Code? Wie kann ich das priceInfo-Array eines Dokuments mit ID-ID abrufen?

******************************** UPDATE ************* *********************

Wie pro Antrag, hier ist die ganze Klasse:

package DatabaseAccess; 

import Models.GasStation; 
import com.mongodb.MongoClient; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import static com.mongodb.client.model.Filters.eq; 
import static com.mongodb.client.model.Projections.excludeId; 
import static com.mongodb.client.model.Projections.fields; 
import static com.mongodb.client.model.Projections.include; 
import com.mongodb.client.model.Updates; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Date; 
import java.util.logging.Level; 
import org.bson.Document; 


public class databaseAccess { 

    private final String DB_HOST = "localhost"; 
    private final int DB_PORT = 27017; 
    private final String DB_NAME = "db1"; 
    private final String DB_COLLECTION = "prices"; 
    private final MongoClient mongoClient; 
    private final MongoDatabase database; 
    private final MongoCollection<Document> collection; 

    public databaseAccess(){ 
     mongoClient = new MongoClient(DB_HOST, DB_PORT); 
     database = mongoClient.getDatabase(DB_NAME); 
     collection = database.getCollection(DB_COLLECTION); 
    } 


    public String readFromDB(String id){ 
     collection.find(eq("id", id)).first().projection(fields(include("priceInfo"), excludeId())); 
     return null;  
    } 

} 
+0

Können Sie bitte den vollständigen Code der Klasse (mit Importen) zeigen. – Spunc

+0

Mögliches Duplikat von [Wie alle Elemente eines verschachtelten Arrays in MongoDB Java gefunden/gefunden werden können] (https://stackoverflow.com/questions/41916428/how-to-retrieve-find-all-elements-of-a-nested -array-in-mongodb-java) – Veeram

+0

es ist kein Duplikat .... das ist ein Array in meinem Fall ist nicht wichtig. Ich möchte das Array als Ganzes erhalten. Ich benutzte den gleichen Code wie der, der die genehmigte Antwort lieferte (abgesehen davon, dass ich den "map ..." -Teil weglasse, da ich, wie bereits erwähnt, nicht daran interessiert bin, einzelne Elemente aus dem Array abzurufen) ... die Sache ist: warum? Dieser Code gibt mir eine Fehleranzeige? –

Antwort

2

Sie sind an der Kette der Anrufe, die in deine Methode. sie jedes Element in der Kette analysieren:

MongoCollection:

FindIterable < TDocument> find() - Findet alle Dokumente in der Sammlung.

Rückgabetyp ist FindIterable<TDocument> und Sie die nächste Methode in der Kette und forderte sie auf:

FindIterable < TDocument>

Methoden von der Schnittstelle com.mongodb.async.client.MongoIterable geerbt:

BatchCursor, zuerst, forEach, in, Karte

Okay, gehen wir zu MongoIterable:

MongoIterable < TResult>:

Leeren ersten (SingleResultCallback Rückruf) - Helper das erste Element im Iterator oder null zurückzukehren.

Das bedeutet first(...) ist nichts zurückgegeben. Sie rufen projection(...) aus dem Nichts, natürlich ist dies nicht anwendbar, so dass der Compiler dies als einen Fehler markiert.

Für den Aufruf projection(Bson projection) sollten Sie FindIterable<T> Instanz haben. MongoCollection.find() können Sie mit diesem Beispiel liefern:

collection.find(eq("id", id)).projection(fields(include("priceInfo"), excludeId()));