MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Push операции в MongoDB

1. Общ преглед

В този урок ще ви представим как да вмъкнете документи в масив в MongoDB. Освен това ще видим различни приложения на $push и $addToset оператори за добавяне на стойности в масив.

Първо, ще създадем примерна база данни, колекция и ще вмъкнем фиктивни данни в нея. Освен това ще разгледаме няколко основни примера за актуализиране на документ с помощта на $push оператор. По-късно ще обсъдим и различните случаи на използване на $push и $addtoSet оператори.

Нека се потопим дълбоко в различните методи за вмъкване на документи в масив в MongoDB.

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

Първо, нека настроим нова база данни baeldung и колекция от проби, поръчки :

use baeldung;
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

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
}

Нека сега проверим документа с customerId  1023. Тук можем да видим, че новият елемент е вмъкнат в края на списъка „items “:

{
    "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, за да избутаме документа в масив. Нека сега внедрим заявката за насочена актуализация с помощта на Java кода.

Преди да извършим операцията по актуализиране, нека първо се свържем с поръчките колекция в baeldung база данни:

mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");

Тук, в този случай, ние се свързваме с MongoDB, който работи на порт по подразбиране 27017 на localhost.

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 Document е новият начин за достъп до документа 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 shell на $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 оператор и документът ще бъде насочен към масив „items“ само ако е уникален.

5.2. Драйвер на Java с помощта на addToSet Оператор

$addToSet Операторът предоставя различен тип операция за актуализиране на масив в сравнение с натискащия оператор:

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 “.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Последователно итериране на курсора mongodb (изчакване на обратни извиквания, преди да преминете към следващия документ)

  2. Използването на буферирани данни в етапа на сортиране при препълване надвишава вътрешното ограничение

  3. mongodb.conf bind_ip =127.0.0.1 не работи, но 0.0.0.0 работи

  4. mongoengine - Заявка към ListField на EmbeddedDocumentField

  5. Ако имам идентификатор на документ mongo като низ, как да го потърся като _id?