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

MongoDB $ empujar

En MongoDB, puede usar el $push operador para agregar un valor a una matriz.

Puede usar varios modificadores para especificar la posición del valor en la matriz, el orden de los elementos en la matriz, agregar múltiples valores, etc.

Ejemplo

Supongamos que tenemos una colección llamada products con los siguientes documentos:

db.products.find()

Resultado:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }

Y digamos que queremos agregar un valor a la matriz en el documento 3.

Podemos usar $push junto con update() para agregar el valor:

db.products.update(
   { _id: 3 },
   { $push: { sizes: "XL" } }
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Miremos la colección nuevamente para verificar el cambio:

db.products.find()

Resultado:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L", "XL" ] }

Insertar el valor en una determinada posición

Puedes usar el $each y $position modificadores para especificar dónde se debe insertar el valor en la matriz.

Por ejemplo, podemos usar un valor de 0 para insertarlo al comienzo de la matriz.

Ejemplo:

db.products.update(
   { _id: 3 },
   { 
     $push: { 
        sizes: {
           $each: [ "S" ],
           $position: 0
        }
      } 
    }
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

El $each El modificador agrega múltiples valores al campo de la matriz. En este caso, solo insertamos un valor en la matriz, sin embargo, para usar la $position modificador, debe aparecer con el $each modificador.

Revisemos la colección nuevamente:

db.products.find()

Resultado:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }

Agregar y ordenar

Supongamos que tenemos una colección con los siguientes documentos:

db.players.find()

Resultado:

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

Y supongamos que queremos agregar algunos valores a la matriz en el documento 3, pero también queremos ordenar la matriz en orden ascendente después de agregar el valor.

Podemos hacer esto:

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 5, 12 ],
           $sort: 1
        }
      } 
    }
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ahora, cuando vemos la colección, podemos ver que el tercer documento se ha modificado en consecuencia.

db.players.find()

Resultado:

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

Para ordenarlo en orden descendente, use $sort: -1 .

Cortar la matriz

Puedes usar el $slice modificador para limitar el número de elementos en la matriz.

Por ejemplo, agreguemos otro valor a la matriz, pero luego dividamos la matriz en una cierta cantidad de elementos.

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $slice: 3
        }
      } 
    }
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ahora revisemos la colección nuevamente:

db.players.find()

Resultado:

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

En este caso, se dividió la matriz, pero el valor que agregamos ni siquiera terminó en la matriz final. Esto se debe a que el valor se agregó a la matriz y no usamos un $sort operación, por lo que el valor permaneció al final de la matriz antes de que la matriz se dividiera en sus primeros tres elementos.

Aquí está de nuevo, excepto que esta vez con el $sort modificador.

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $sort: 1,
           $slice: 3
        }
      } 
    }
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Consulta la colección:

db.players.find()

Resultado:

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

Agregar valor solo si no existe

Si desea que el valor se agregue solo si aún no existe en la matriz, considere usar $addToSet operador.