sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualización de MongoDB Uno ()

En MongoDB el db.collection.updateOne() El método actualiza un solo documento dentro de la colección según el filtro.

Ejemplo

Supongamos que tenemos una colección llamada pets que contiene los siguientes documentos:

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

Podemos actualizar un documento como este:

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

Resultado:

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

Eso actualizó solo un documento, aunque dos documentos coinciden con los criterios de filtro (los criterios son type: "Dog" ).

Podemos comprobar los resultados así:

db.pets.find()

Resultado:

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

El primer documento ahora tiene un type de Cow en lugar de Dog , pero el segundo documento no se vio afectado, aunque también coincidía con los criterios de filtrado.

Inserción

db.collection.updateOne() método acepta un upsert argumento que le permite realizar una operación upsert.

Cuando upsert: true , el documento se actualiza si coincide con los criterios de filtro, pero si no coincide, se inserta un nuevo documento.

Empecemos de nuevo con los documentos originales:

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

Ejemplo:

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

Resultado:

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

En este caso, no hubo coincidencias, por lo que se alteró un documento.

Revisemos la colección.

db.pets.find()

Resultado:

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

Documentos incrustados

También puede usar db.collection.updateOne() para actualizar documentos incrustados.

Supongamos que tenemos el siguiente documento:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Podemos usar el siguiente código para actualizar el documento incrustado.

db.pets.updateOne({ 
    _id: 1 
    }, { 
        $set: { 
            "specs.weight": 20, 
            "specs.color": "blue"
        } 
})

Resultado:

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

Entonces podemos ver que un documento fue actualizado.

Revisemos el documento.

db.pets.find({
    _id: 1
    }).pretty()

Resultado:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 20,
		"color" : "blue"
	}
}

Podemos ver que el documento incrustado se actualizó según lo especificado.

Arreglos

Usemos db.collection.updateOne() para actualizar una matriz.

Supongamos que tenemos el siguiente documento:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

Actualicemos dos de los elementos de la matriz y el nombre del perro.

db.pets.updateOne({ 
    _id: 1 
    }, { 
        $set: { 
            "name": "Bark",
            "awards.0": "Bottom Dog", 
            "awards.1": "Worst Dog"
        } 
})

Resultado:

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

Podemos ver que un documento fue actualizado.

Y veamos el documento.

db.pets.find().pretty()

Resultado:

{
	"_id" : 1,
	"name" : "Bark",
	"type" : "Dog",
	"awards" : [
		"Bottom Dog",
		"Worst Dog",
		"Biggest Dog"
	]
}

Los arrayFilters Parámetro

También puede usar los arrayFilters parámetro y el posicional $ operador para determinar qué elementos de la matriz actualizar.

Por ejemplo, supongamos que tenemos una colección llamada players con los siguientes documentos:

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

Podríamos ejecutar la siguiente consulta para actualizar solo aquellos elementos de la matriz que tengan un valor superior a cierta cantidad (en este caso, 10).

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

Resultado:

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

Como era de esperar, esto solo actualiza un documento, aunque dos documentos coinciden con los criterios.

Así es como se ven los documentos ahora.

db.players.find()

Resultado:

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

El documento 2 tenía dos elementos de matriz actualizados, porque esos elementos coincidían con los criterios.

Más información

db.collection.updateOne() El método también acepta otros parámetros, como writeConcern , collation y hint .

Consulte la documentación de MongoDB para db.collections.updateOne() para más información.