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

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

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

MongoDB е многоплатформена, ориентирана към документи, NoSQL база данни с отворен код, написана на C++. Освен това MongoDB осигурява висока производителност, висока наличност и автоматично мащабиране.

За да актуализираме документите в MongoDB, можем да използваме различни методи като updateOne , findOneAndUpdate, и т.н. Освен това MongoDB предоставя различни оператори за методите за актуализиране.

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

2. Настройка на база данни

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

use baeldung;
db.createCollection(student);

Като илюстрация, нека добавим няколко документа в колекцията student с помощта на insertMany заявка:

db.student.insertMany([
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 1",
        "age": 16,
        "roll_no":199406
    },
    {
        "student_id": 8765,
        "student_name": "Andrew Boult",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199408
    }
]);

При успешно вмъкване ще получим JSON с acknowledged:true :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("621b078485e943405d04b557"),
	ObjectId("621b078485e943405d04b558")
    ]
}

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

3. Използване на updateOne Метод

Операция за актуализиране в MongoDB може да се извърши чрез добавяне на ново поле, премахване на поле или актуализиране на съществуващо поле. updateOne  метод актуализира единичен документ в колекция въз основа на приложения филтър за заявка. Първо намира документа, който съответства на филтъра, и след това актуализира посочените полета.

Освен това, можем да използваме различни оператори като $set , $unset , $inc и т.н. с метода за актуализиране.

За да демонстрираме, нека разгледаме заявката за актуализиране на един документ от колекция:

db.student.updateOne(
    { 
        "student_name" : "Paul Starc"
    },
    { 
        $set: {
            "address" : "Hostel 2"
        }
    }
 );

Ще получим изход, подобен на показания по-долу:

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

Нека сега да проверим кода на драйвера на Java на горния updateOne заявка:

UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));

Тук първо използвахме име_ученик поле за филтриране на документите. След това актуализираме адреса на документа с име_ученик „Пол Старк“.

4. Използване на updateMany Метод

updateMany метод актуализира всички документи в колекциите на MongoDB, които съответстват на дадения филтър. Едно от предимствата на използването на updateMany е, че можем да актуализираме множество документи, без да губим полетата на стари документи.

Нека видим заявката за обвивка на MongoDB с помощта на updateMany метод:

db.student.updateMany(
    { 
        age: { 
            $lt: 20
         } 
    },
    { 
        $set:{ 
            "Review" : true 
        }
    }
);

Горната команда ще върне следния изход:

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

Тук matchedCount съдържа броя на съответстващите документи, докато modifiedCount съдържа номера на променените документи.

Нека сега да разгледаме кода на драйвера на Java с помощта на updateMany метод:

UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

Тук всички документи с възраст по-малко от 20 ще бъдат филтрирани, а Преглед полето ще бъде зададено на true .

5. Използване на replaceOne Метод

replaceOne методът на MongoDB замества целия документ. Един от недостатъците на replaceOne е, че всички по-стари полета ще бъдат заменени с новите полета, а по-старите полета също ще бъдат загубени:

db.student.replaceOne(
    { 
        "student_id": 8764
    },
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406
    }
);

В този случай ще получим следния изход:

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

Ако не бъдат намерени съвпадения, операцията връща matchedCount като 0:

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

Нека напишем съответния код на драйвер на Java с помощта на replaceOne метод:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age",18)
  .append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

В горния код създадохме документ, с който по-старият документ ще бъде заменен. Документът с идентификатор на_студент 8764 ще бъде заменен с новосъздадения документ.

6. Използване на findOneAndReplace Метод

findOneAndReplace Методът е един от усъвършенстваните методи за актуализиране, предоставени от MongoDB, и замества първия съвпадащ документ въз основа на дадените критерии за избор. По подразбиране този метод връща оригиналния документ. Можем да използваме различни опции на findOneAndReplace за сортиране и проектиране на документи, ако е необходимо.

Накратко, findOneAndReplace замества първия съвпадащ документ от колекцията въз основа на приложения филтър:

db.student.findOneAndReplace(
    { 
        "student_id" : { 
            $eq : 8764 
        }
    },
    { 
        "student_id" : 8764,
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    {
        returnNewDocument: false
    }
);

Тази заявка ще върне следния документ:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 1",
    "age":16,
    "roll_no":199406
}

Ако зададем returnNewDocument до true , тогава операцията ще върне заместения документ:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 2",
    "age":18,
    "roll_no":199406
}

Нека сега да използваме findOneAndReplace метод за проектиране на student_id и възраст полета в върнатия документ:

db.student.findOneAndReplace(
    { 
        "student_id" : {
        $eq : 8764 
        } 
    },
    { 
        "student_id" : 8764, 
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    { 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "age" : 1 
        } 
    }
);

Резултатът от горната заявка ще съдържа само прогнозираните полета:

{
    "student_id":"8764",
    "age":16
}

Кодът на драйвера на Java на горната заявка с различни опции на findOneAndReplace:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age", 18)
  .append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
  Filters.eq("student_id", 8764), 
  replaceDocument,
  new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));

В горната заявка findOneAndReplace метод първо ще сортира документите във възходящ ред въз основа на roll_no, и новосъздаденият документ замества документа с student_id „8764“.

7. Използване на findOneAndUpdate Метод

findOneAndUpdate метод актуализира първия съвпадащ документ в колекцията. Ако повече от един документ отговаря на критериите за избор, тогава той актуализира само първия съответстващ документ. Когато актуализираме документа, стойността на _id полето остава непроменено:

db.student.findOneAndUpdate(
    { 
        "student_id" : 8764
    },
    { 
        $inc : { 
            "roll_no" : 5
        } 
    },
    { 
        sort: { 
            "roll_no" : 1 
        }, 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "address" : 1
        }
    }
);

Резултатът от заявката ще съдържа само studentId и адрес на по-стария документ:

{
    "student_id":8764,
    "address":"Hostel 1"
}

Кодът на драйвера на Java на горната заявка, използващ различни опции на findOneAndUpdate е както следва:

Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
  Filters.eq("student_id", 8764),
  Updates.inc("roll_no", 5), 
  new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

В този случай findOneAndUpdate метод първо ще сортира документа във възходящ ред въз основа на roll_no . Горната заявка увеличава roll_no  с 5 и след това връща идентификатор на_студент и адрес полета.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Вземете броя на отворените връзки в mongoDB с помощта на java

  2. mongodb не можа да се свърже със сървъра

  3. Йерархични заявки с Mongo с помощта на $graphLookup

  4. Импортирайте CSV данни като масив в MongoDB с помощта на mongoimport

  5. Spring Boot свързва Mysql и MongoDb