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

Актуализирайте множество полета в документ на MongoDB

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

MongoDB е документно-ориентирана NoSQL база данни, която е публично достъпна. Можем да актуализираме документите в колекция, използвайки различни методи като актуализация , заменете и запазете . За да променим конкретно поле на документа, ще използваме различни оператори като $set , $inc, и др.

В този урок ще се научим да променяме множеството полета на документ с помощта на актуализация и заменете запитване. За демонстрационни цели първо ще обсъдим заявката за mongo shell и след това съответната й реализация в Java.

Нека сега разгледаме различните методи за постигане на целта.

2. Shell заявка за актуализиране на различни полета

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

use baeldung;
db.createCollection(employee);

Нека сега добавим няколко документа в тази колекция с помощта на insertMany заявка:

db.employee.insertMany([
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Representative",
        "department_id": 2,
        "salary": 20000,
        "hire_date": NumberLong("1643969311817")
    },
    {
        "employee_id": 794876,
        "employee_name": "Joe Butler",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1645338658000")
    }
]);

В резултат на това ще получим JSON с ObjectId и за двата документа, както е показано по-долу:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Досега сме настроили необходимата среда. Нека сега актуализираме документите, които току-що поставихме.

2.1. Актуализиране на множество полета на един документ

Можем да използваме $set и $inc оператори за актуализиране на всяко поле в MongoDB. $set операторът ще зададе новопосочената стойност, докато $inc оператор ще увеличи стойността с определена стойност.

Нека първо разгледаме заявката MongoDB, за да актуализираме две полета от колекцията на служителите, използвайки $set оператор:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

В горната заявка employee_id и име_на_служител полето се използва за филтриране на документа и $set операторът се използва за актуализиране на заданието и department_id полета.

Можем също да използваме $set и $inc оператори заедно в една заявка за актуализиране:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Това ще актуализира заданието поле на мениджър продажби и увеличете department_id от 1.

2.2. Актуализиране на множество полета на множество документи

Освен това можем също да актуализираме множество полета на повече от един документ в MongoDB. Просто трябва да включим опцията multi:true за да промените всички документи, които отговарят на критериите за филтърна заявка:

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

Като алтернатива ще получим същите резултати с помощта на updateMany заявка:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

В горната заявка използвахме updateMany метод за актуализиране на повече от 1 документ от колекцията.

2.3. Често срещан проблем при актуализиране на множество полета

Досега се научихме да актуализираме множество полета с помощта на заявката за актуализиране, като предоставим два различни оператора или използвайки един оператор за множество полета.

Сега, ако използваме оператор няколко пъти с различни полета в една заявка, MongoDB ще актуализира само последния израз на заявката за актуализиране и игнорирайте останалото:

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

Горната заявка ще върне подобен изход на този:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

В този случай единствената работа ще бъде актуализиран до „Мениджър продажби“. department_id стойността няма да бъде актуализирана до 3.

3. Актуализирайте полетата с Java драйвер

Досега обсъдихме необработените заявки на MongoDB. Нека сега да извършим същите операции с Java. MongoDB Java драйвер поддържа два класа за представяне на MongoDB документ, com.mongodb.BasicDBObject и org.bson.Document. Ще разгледаме и двата метода за актуализиране на полета в документ.

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

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

Тук предположихме, че MongoDB работи локално на порта по подразбиране 27017.

3.1. Използване на DBObject

За да създадем документа в MongoDB, ще използваме com.mongodb. Интерфейс на DBObject и неговия клас за реализация com.mongodb.BasicDBObject .

Реализацията на DBObject се базира на двойки ключ-стойност. BasicDBObject е наследен от LinkedHashMap клас, който е в util пакет.

Нека сега да използваме com.mongodb.BasicDBObject за да извършите операцията за актуализиране на множество полета:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

Тук първо създадохме филтърна заявка на базата на employee_id. Тази операция ще върне набор от документи. Освен това актуализирахме стойността на department_id и работа според зададената заявка.

3.2. Използване на bson Документ

Можем да изпълняваме всички операции на MongoDB с помощта на bson документ. За това първо се нуждаем от обекта за събиране и след това изпълним операцията за актуализиране с помощта на updateMany метод с филтър и настройте функции.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Тук предаваме филтър за заявка към updateMany метод. екв. филтърът съответства на employee_id с точно съвпадащия текст „794875“. След това актуализираме department_id и работата като използвате набора оператор.

4. Използване на Замяна на заявка

Наивният подход за актуализиране на множеството полета на един документ е да го замените с нов документ, който има актуализирани стойности.

Например, ако искаме да заменим документ с employee_id 794875, можем да изпълним следната заявка:

db.employee.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

Горната команда ще отпечата JSON за потвърждение в изхода:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Тук employee_id полето се използва за филтриране на документа. Вторият аргумент на заявката за актуализиране обозначава документа, от който ще бъде заменен съществуващият документ.

В горната заявка изпълняваме replaceOne , следователно, той ще замени само един документ с този филтър. Като алтернатива, ако искаме да заменим всички документи с тази филтърна заявка, тогава ще трябва да използваме updateMany метод.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Показване на цялото съдържание от всички колекции

  2. mongoexport без поле _id

  3. Как да форматирате числа в SQL

  4. Mongoose Уникални стойности във вложен масив от обекти

  5. Анализиране на бавни заявки в MongoDB