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

MongoDB актуализиране Много()

В MongoDB db.collection.updateMany() метод актуализира всички документи, които съответстват на посочения филтър за колекция.

Пример

Да предположим, че имаме колекция, наречена pets който съдържа следните документи:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Можем да видим, че два документа имат Dog като техен type .

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

db.pets.updateMany( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Резултат:

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

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

Можем да проверим колекцията:

db.pets.find()

Резултат:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Нагоре

db.collection.updateMany() методът приема upsert аргумент, който ви позволява да извършите операция upsert.

Когато upsert: true , всички документи, които отговарят на критериите за филтриране, се актуализират, но ако няма съвпадение, се вмъква нов документ.

Нека започнем отново с оригиналните документи:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Пример:

db.pets.updateMany( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Резултат:

 {
 "acknowledged" : true,
 "matchedCount" : 0,
 "modifiedCount" : 0,
 "upsertedId" : ObjectId("5fe27e1dd991410169410244")
 } 

В този случай нямаше съвпадения, така че документът беше въведен.

Нека проверим колекцията.

db.pets.find()

Резултат:

 { "_id" : 1, "name" : "Wag", "type" : "Dog" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe27e1dd991410169410244"), "name" : "Bubbles", "type" : "Fish" } 

Вградени документи

Можете също да използвате db.collection.updateMany() за да актуализирате вградените документи.

Да предположим, че вмъкваме следните документи:

db.pets.insertMany([
    {
        "_id" : 1,
        "name" : "Wag",
        "type" : "Dog",
        "specs" : {
            "height" : 400,
            "weight" : 15,
            "color" : "white"
        }
    },  
    {
        "_id" : 2,
        "name" : "Bark",
        "type" : "Dog",
        "specs" : {
            "height" : 200,
            "weight" : 12,
            "color" : "white"
        }
    }
])

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

db.pets.updateMany({ 
    type: "Dog" 
    }, { 
        $set: { 
            "specs.color": "brown",
            "specs.gooddog": false
        } 
})

Резултат:

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

Така че можем да видим, че и двата документа са актуализирани.

Нека проверим документа.

db.pets.find({
    type: "Dog"
    }).pretty()

Резултат:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown",
		"gooddog" : false
	}
}
{
	"_id" : 2,
	"name" : "Bark",
	"type" : "Dog",
	"specs" : {
		"height" : 200,
		"weight" : 12,
		"color" : "brown",
		"gooddog" : false
	}
}

Можем да видим, че вградените документи са актуализирани, както е посочено.

Масиви

Нека използваме db.collection.updateMany() за да актуализирате масив.

Да предположим, че имаме колекция, наречена players със следните документи:

 { "_id" : 1, "scores" : [ 1, 5, 3 ] }
 { "_id" : 2, "scores" : [ 8, 17, 18 ] }
 { "_id" : 3, "scores" : [ 15, 11, 8 ] } 

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

db.players.updateMany({}, 
{ 
        $set: {
            "scores.0": 20, 
            "scores.1": 26
        } 
})

Резултат:

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

Виждаме, че и трите документа са актуализирани. Това е така, защото оставих критериите за филтриране празни (използвах {} за критериите за филтриране).

И нека разгледаме документа.

db.players.find()

Резултат:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

Параметърът arrayFilters

Можете също да използвате arrayFilters параметър и позиционния $ оператор, за да определи кои елементи на масива да актуализира.

Например, разглеждайки предишния ни документ:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

Бихме могли да изпълним следната заявка, за да актуализираме само онези елементи на масива, които имат стойност, по-висока от определено количество (в този случай 15).

db.players.updateMany(
   { scores: { $gte: 15 } },
   { $set: { "scores.$[e]" : 15 } },
   { arrayFilters: [ { "e": { $gte: 15 } } ] }
)

Резултат:

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

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

Ето как изглеждат документите сега.

db.players.find()

Резултат:

{ "_id" : 1, "scores" : [ 15, 15, 3 ] }
{ "_id" : 2, "scores" : [ 15, 15, 15 ] }
{ "_id" : 3, "scores" : [ 15, 15, 8 ] }

Единствените елементи на масива, които бяха актуализирани, бяха тези със стойност над 15.

Повече информация

db.collection.updateMany() Методът приема и други параметри, като writeConcern , collation и hint .

Вижте документацията на MongoDB за db.collections.updateMany() за повече информация.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как мога да изчакам докер контейнерът да започне да работи?

  2. VersionError:Няма намерен съответстващ документ грешка в Node.js/Mongoose

  3. Как да използвате $unset и $set в комбинация в mongoDB

  4. mongo групова заявка как да запазите полета

  5. Паралелност в gopkg.in/mgo.v2 (Mongo, Go)