1. Обзор
В этом руководстве мы расскажем, как вставлять документы в массив в MongoDB . Кроме того, мы увидим различные применения операторов $push и
$addToset
для добавления значений в массив.
Сначала мы создадим образец базы данных, коллекцию и вставим в нее фиктивные данные. Далее мы рассмотрим несколько основных примеров обновления документа с помощью оператора $push .
Позже мы также обсудим различные варианты использования операторов $push
и $addtoSet
.
Давайте углубимся в различные методы вставки документов в массив в MongoDB.
2. Инициализация базы данных
Прежде всего, давайте настроим новую базу данных foreach
и образец коллекции, заказы
:
use foreach;
db.createCollection(orders);
Теперь добавим в коллекцию несколько документов с помощью метода insertMany
:
db.orders.insertMany([
{
"customerId": 1023,
"orderTimestamp": NumberLong("1646460073000"),
"shippingDestination": "336, Street No.1 Pawai Mumbai",
"purchaseOrder": 1000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "VEG PIZZA",
"quantity": 1,
"price": 800
}
]
},
{
"customerId": 1027,
"orderTimestamp": NumberLong("1646460087000"),
"shippingDestination": "445, Street No.2 Pawai Mumbai",
"purchaseOrder": 2000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "NON-VEG PIZZA",
"quantity": 1,
"price": 1200
}
]
}
]);
В случае успешной вставки приведенная выше команда напечатает JSON, подобный показанному ниже:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
На данный момент мы успешно настроили базу данных и коллекцию. Мы будем использовать эту базу данных и коллекцию для всех примеров.
3. Push-операция с использованием Mongo Query
MongoDB предоставляет различные типы операторов массивов для обновления массивов в документах MongoDB. Оператор $push
в MongoDB добавляет значение в конец массива. В зависимости от типа запроса мы можем использовать оператор $push с такими методами, как
updateOne
, updateMany
, findAndModify
и т. д.
Давайте теперь рассмотрим запрос оболочки с помощью оператора $push :
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
Приведенный выше запрос вернет следующий документ:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Давайте теперь проверим документ с идентификатором клиента
1023. Здесь мы видим, что новый элемент вставлен в конец списка « элементы
»:
{
"customerId" : 1023,
"orderTimestamp" : NumberLong("1646460073000"),
"shippingDestination" : "336, Street No.1 Pawai Mumbai",
"purchaseOrder" : 1000,
"contactNumber" : "9898987676",
"items" : [
{
"itemName" : "BERGER",
"quantity" : 1,
"price" : 500
},
{
"itemName" : "VEG PIZZA",
"quantity" : 1,
"price" : 800
},
{
"itemName" : "PIZZA MANIA",
"quantity" : 1,
"price" : 800
}
]
}
4. Операция push с использованием кода драйвера Java
До сих пор мы обсуждали запрос оболочки MongoDB для помещения документа в массив. Давайте теперь реализуем запрос на push-обновление, используя код Java.
Перед выполнением операции обновления давайте сначала подключимся к коллекции заказов в базе данных
foreach
:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("foreach");
MongoCollection<Document> collection = database.getCollection("orders");
Здесь, в данном случае, мы подключаемся к MongoDB, которая работает на порту 27017 по умолчанию на локальном хосте.
4.1. Использование DBObject
Драйвер MongoDB Java обеспечивает поддержку документов DBObject
и BSON
. Здесь объект DBObject
является частью устаревшего драйвера MongoDB, но в более новой версии MongoDB он не рекомендуется.
Давайте теперь посмотрим на код драйвера Java, чтобы вставить новые значения в массив:
DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
.append("quantity", 1)
.append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);
В приведенном выше запросе мы сначала создали документ элемента, используя BasicDBObject
. На основе searchQuery
документы коллекции будут отфильтрованы, а значения будут помещены в массив.
4.2. Использование документа BSON
Документ BSON
— это новый способ доступа к документу MongoDB на Java, созданный с использованием более нового клиентского стека. Класс org.bson.Document
менее сложен и удобен в использовании.
Давайте воспользуемся классом org.bson.Document
для помещения значений в массив « items»
:
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));
В этом случае реализация BSON
аналогична коду, запускаемому с использованием DBObject,
и обновление также будет таким же. Здесь мы использовали метод updateOne
для обновления только одного документа.
5. Использование оператора addToSet
Оператор $addToSet
также можно использовать для добавления значения в массив. Этот оператор добавляет значения, только если это значение не существует в массиве. В противном случае он просто проигнорирует его. В то время как оператор push вставит значение в качестве условия для фильтрации, чтобы получить совпадение.
Следует отметить один ключевой момент : оператор $addToSet
не активирует работу значения в случае дублирующегося элемента. С другой стороны, оператор $push
просто помещает значение в массив независимо от любых других условий.
5.1. Запрос оболочки с использованием оператора addToSet
Запрос оболочки mongo оператора $addToSet
аналогичен оператору $push
, но $addToSet
не вставляет повторяющееся значение в массив.
Давайте теперь проверим запрос MongoDB, чтобы поместить значения в массив с помощью $addToset
:
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
В этом случае вывод будет следующим:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
В этом случае мы использовали оператор $addToSet
, и документ будет помещен в массив «элементов», только если он уникален.
5.2. Драйвер Java с использованием оператора addToSet
Оператор $ addToSet
обеспечивает другой тип операции обновления массива по сравнению с оператором push:
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
.updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);
В приведенном выше коде сначала мы создали документ « item
», а на основе фильтра customerId метод
updateOne
попытается протолкнуть документ « item
» в массив « items
».
6. Заключение
В этой статье мы научились добавлять новые значения в массив с помощью операторов $push и $addToSet
. Сначала мы рассмотрели использование оператора $push
в запросе оболочки MongoDB, а затем обсудили соответствующий код драйвера Java.
Реализацию всех кейсов можно найти на GitHub .