получение данных с помощью java-драйвера mongodb 3.4 с использованием find () - метода с проекцией

Я использую java-драйвер mongodb 3.4.

В базе данных mongodb документы сохраняются в следующей структуре:

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

Чтобы получить массив «priceInfo» документа с определенным идентификатором, я написал следующий код:

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

Я написал этот код в соответствии с документацией, которую вы можете найти здесь:

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

Проблема в том, что моя IDE не примет этот код.

Это дает мне следующую индикацию ошибки:

введите здесь описание изображения

Я понятия не имею, почему этот код не работает. Сначала IDE предлагала включить несколько классов, что я и сделал. Но после этого у меня все равно появлялась индикация ошибки, а именно та, которую вы видите выше.

Что не так с кодом? Как я могу получить массив priceInfo документа с идентификатором id?

********************************ОБНОВИТЬ***************** *****************

По запросу вот весь класс:

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

}

person steady_progress    schedule 03.07.2017    source источник
comment
Не могли бы вы показать полный код вашего класса (с импортом).   -  person Spunc    schedule 04.07.2017
comment
Возможный дубликат Как получить / найти все элементы вложенного массива в MongoDB Java   -  person s7vr    schedule 04.07.2017
comment
это не дубликат .... что это массив в моем случае не важно. Я хочу получить массив целиком. Я использовал тот же код, что и тот, который предоставляет утвержденный ответ (кроме отказа от карты ... части, поскольку я, как уже упоминалось, не заинтересован в извлечении отдельных элементов из массива) ... Дело в том, почему этот код дать мне указание на ошибку?   -  person steady_progress    schedule 04.07.2017
comment
Пожалуйста, подумайте о чтении javadocs при использовании методов. Это помогло мне и, несомненно, поможет вам правильно использовать API. Это ошибка времени компиляции, которая говорит о том, что вы неправильно используете API. Кстати, ответ действительно содержит правильное использование первого с прогнозами.   -  person s7vr    schedule 04.07.2017
comment
TBH, я следую руководству docs.mongodb .com / manual / tutorial / каким-то образом include keyowrd выдает мне ошибку, просто чтобы вернуть поле _id.   -  person Stu_Dent    schedule 11.10.2020


Ответы (1)


Вы оперируете цепочкой вызовов в своем методе. Разберем каждый элемент в цепочке:

MongoCollection:

FindIterable ‹TDocument› find () - находит все документы в коллекции.

Тип возврата - FindIterable<TDocument>, и вы вызываете для него следующий метод в цепочке:

FindIterable ‹TDocument›

Методы, унаследованные от интерфейса com.mongodb.async.client.MongoIterable:

batchCursor, first, forEach, в, map

Хорошо, мы собираемся MongoIterable:

MongoIterable ‹TResult›:

void first (обратный вызов SingleResultCallback) - помощник для возврата первого элемента в итераторе или null.

Это означает, что first(...) ничего не возвращается. Вы вызываете projection(...) из ничего, конечно, это неприменимо, поэтому компилятор отмечает это как ошибку.

Для вызова projection(Bson projection) у вас должен быть FindIterable<T> экземпляр. MongoCollection.find() может предоставить вам этот экземпляр:

collection.find(eq("id", id)).projection(fields(include("priceInfo"), excludeId()));
person J-Alex    schedule 03.07.2017