MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $ push


No MongoDB, você pode usar o $push operador para anexar um valor a uma matriz.

Você pode usar vários modificadores para especificar a posição do valor na matriz, a ordem dos elementos na matriz, anexar vários valores, etc.

Exemplo


Suponha que tenhamos uma coleção chamada products com os seguintes 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" ] } 
E digamos que queremos anexar um valor ao array no documento 3.

Podemos usar $push em conjunto com update() para anexar o valor:
db.products.update(
   { _id: 3 },
   { $push: { sizes: "XL" } }
) 

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

Vamos examinar a coleção novamente para verificar a alteração:
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" ] }

Inserir o valor em uma determinada posição


Você pode usar o $each e $position modificadores para especificar onde o valor deve ser inserido na matriz.

Por exemplo, podemos usar um valor de 0 para inseri-lo no início da matriz.

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

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

O $each modificador acrescenta vários valores ao campo de matriz. Neste caso inserimos apenas um valor no array, porém, para usar o $position modificador, ele deve aparecer com o $each modificador.

Vamos verificar a coleção novamente:
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" ] }

Anexar e classificar


Suponha que temos uma coleção com os seguintes documentos:
db.players.find() 

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

E suponha que queremos anexar alguns valores à matriz no documento 3, mas também queremos classificar a matriz em ordem crescente depois de anexarmos o valor.

Nós podemos fazer isso:
db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 5, 12 ],
           $sort: 1
        }
      } 
    }
) 

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

Agora, quando visualizamos a coleção, podemos ver que o terceiro documento foi modificado de acordo.
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 classificá-lo em ordem decrescente, use $sort: -1 .

Faça o corte da matriz


Você pode usar o $slice modificador para limitar o número de elementos na matriz.

Por exemplo, vamos adicionar outro valor ao array, mas depois dividir o array em um certo número de elementos.
db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $slice: 3
        }
      } 
    }
) 

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

Agora vamos verificar a coleção novamente:
db.players.find() 

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

Nesse caso, o array foi fatiado, mas o valor que anexamos nem acabou no array final. Isso ocorre porque o valor foi anexado ao array e não usamos um $sort operação e, portanto, o valor permaneceu no final da matriz antes que a matriz fosse dividida em seus três primeiros elementos.

Aqui está novamente, exceto desta vez com o $sort modificador.
db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $sort: 1,
           $slice: 3
        }
      } 
    }
) 

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

Confira a coleção:
db.players.find() 

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

Anexar valor somente se não existir


Se você quiser que o valor seja anexado apenas se ele ainda não existir na matriz, considere usar o $addToSet operador.