Перейти к основному содержимому

Получить значение из MongoDB по имени ключа

· 5 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как получить значение из MongoDB по имени ключа. Мы рассмотрим различные методы MongoDB для получения имен ключевых полей документов на основе примененных фильтров. Сначала мы будем использовать метод find или findone для получения необходимых данных, а затем воспользуемся методом агрегирования . Здесь мы будем писать запросы как в запросе оболочки MongoDB, так и в коде драйвера Java.

Давайте рассмотрим различные способы получения значения в MongoDB по имени поля.

2. Инициализация базы данных

Для начала нам нужно настроить новую базу данных foreach и новую коллекцию travel :

use foreach;
db.createCollection(travel);

Давайте теперь добавим в коллекцию некоторые фиктивные данные, используя метод insertMany MongoDB:

db.travel.insertMany([
{
"passengerId":145,
"passengerName":"Nathan Green",
"passengerAge":25,
"sourceStation":"London",
"destinationStation":"Birmingham",
"seatType":"Slepper",
"emailAddress":"nathongreen12@gmail.com"
},
{
"passengerId":148,
"passengerName":"Kevin Joseph",
"passengerAge":28,
"sourceStation":"Manchester",
"destinationStation":"London",
"seatType":"Slepper",
"emailAddress":"kevin13@gmail.com"
},
{
"passengerId":154,
"passengerName":"Sheldon burns",
"passengerAge":26,
"sourceStation":"Cambridge",
"destinationStation":"Leeds",
"seatType":"Slepper",
"emailAddress":"sheldonnn160@gmail.com"
},
{
"passengerId":168,
"passengerName":"Jack Ferguson",
"passengerAge":24,
"sourceStation":"Cardiff",
"destinationStation":"Coventry",
"seatType":"Slepper",
"emailAddress":"jackfergusion9890@gmail.com"
}
]);

Приведенный выше запрос insertMany вернет следующий JSON:

{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623d7f079d55d4e137e47825"),
ObjectId("623d7f079d55d4e137e47826"),
ObjectId("623d7f079d55d4e137e47827"),
ObjectId("623d7f079d55d4e137e47828")
]
}

До сих пор мы вставляли фиктивные данные в сбор путешествия .

3. Использование метода поиска

Метод find находит и возвращает документы, соответствующие указанным критериям запроса в коллекции. Если несколько документов соответствуют условию, то будут возвращены все документы в зависимости от порядка документов на диске. Кроме того, в MongoDB метод find поддерживает проекцию параметров в запросе. Если мы укажем параметр проекции в методе find , он вернет все документы, содержащие только поля проекции.

Следует отметить один ключевой момент: поле _id всегда включается в ответ, если только оно не удалено явным образом.

Чтобы продемонстрировать, давайте рассмотрим запрос оболочки для проецирования ключевого поля:

db.travel.find({},{"passengerId":1}).pretty();

Ответом на приведенный выше запрос будет:

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

Здесь, в этом запросе, мы просто спроецировали пассажирский идентификатор. Давайте теперь посмотрим на ключевое поле с исключением _id :

db.travel.find({},{"passengerId":1,"_id":0}).pretty();

Приведенный выше запрос будет иметь следующий ответ:

{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }

Здесь, в этом запросе, мы исключили поле _id из проекции ответа. Давайте посмотрим на код драйвера Java для приведенного выше запроса:

MongoClient mongoClient = new MongoClient("localhost", 27017);
DB database = mongoClient.getDB("foreach");
DBCollection collection = database.getCollection("travel");
BasicDBObject queryFilter = new BasicDBObject();
BasicDBObject projection = new BasicDBObject();
projection.put("passengerId", 1);
projection.put("_id", 0);
DBCursor dbCursor = collection.find(queryFilter, projection);
while (dbCursor.hasNext()) {
System.out.println(dbCursor.next());
}

В приведенном выше коде сначала мы создали соединение MongoClient с локальным сервером mongo, работающим на порту 27017 . Затем мы использовали метод find , который имеет два параметра: queryFilter и проекцию. Запрос DBObject содержит фильтры, по которым нам нужно получить данные. Здесь мы напечатали все спроецированные поля проездных документов с помощью DBCursor .

4. Использование метода агрегации

Операции агрегирования в MongoDB обрабатывают записи данных и документы и возвращают вычисленные результаты. Он собирает значения из различных документов и группирует их перед выполнением различных типов операций над сгруппированными данными, таких как сумма, среднее, минимум, максимум и т. д.

Мы можем использовать конвейер агрегации MongoDB, когда нам нужно выполнить более сложную агрегацию. Конвейеры агрегации — это наборы этапов, объединенных синтаксисом запросов MongoDB для получения агрегированных результатов.

Давайте рассмотрим запрос агрегации, чтобы получить значение по имени ключа:

db.travel.aggregate([
{
"$project":{
"passengerId":1
}
}
]).pretty();

Ответом на приведенный выше запрос агрегации будет:

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

В этом случае мы использовали стадию $project конвейера агрегации. $project указывает, какие поля включить или исключить. В нашем запросе мы передали только пассажирский идентификатор на этапе проецирования.

Давайте посмотрим на код драйвера Java для приведенного выше запроса:

ArrayList<Document> response = new ArrayList<>();
ArrayList<Document> pipeline = new ArrayList<>(Arrays.asList(new Document("$project", new Document("passengerId", 1L))));
database = mongoClient.getDatabase("foreach");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- " + response);

Мы также можем написать конвейер агрегации следующим образом:

ArrayList<Document> response = new ArrayList<>();
ArrayList<Bson> pipeline = new ArrayList<>(Arrays.asList(
project(fields(Projections.exclude("_id"), Projections.include("passengerId")))));
MongoDatabase database = mongoClient.getDatabase("foreach");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- "+response);

Мы создали конвейер агрегации с кодом драйвера Java и настроили этап проекта только на включение поляpassageId . Наконец, мы передали конвейер агрегации в метод агрегации для получения данных.

5. Вывод

В этой статье мы научились извлекать значение по имени ключа в MongoDB. Мы изучили различные методы MongoDB для получения данных. Сначала мы извлекаем данные, используя метод find , а затем метод агрегата . Мы рассмотрели варианты использования проекции полей в MongoDB. Короче говоря, мы реализовали проекцию полей, используя запрос оболочки Mongo и код драйвера Java.

Реализацию всех кейсов мы можем найти на GitHub .