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

Correção “$pullAll requer um argumento de matriz, mas recebeu um duplo” no MongoDB


Se você receber o “$pullAll requer um argumento de matriz, mas recebeu um duplo ” no MongoDB, é porque você não forneceu um array como o valor a ser substituído.

Exemplo


Suponha que temos uma coleção com os seguintes documentos:
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

E queremos usar $pullAll para substituir todas as ocorrências de um valor em um desses documentos.

Código do problema


Aqui está um exemplo de código que causa o erro acima:
db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: 7 } } 
)

Resultado:
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 0,
	"nModified" : 0,
	"writeError" : {
		"code" : 2,
		"errmsg" : "$pullAll requires an array argument but was given a double"
	}
})

Isso aconteceu porque esquecemos de cercar o valor 7 com colchetes. Em outras palavras, esquecemos de fornecer um array.

Solução


Aqui está o mesmo código, exceto que desta vez fornecemos o valor como uma matriz:
db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: [ 7 ] } } 
)

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

Isso nos mostra que um documento foi correspondido e modificado.

Vejamos agora a coleção:
db.foo.find()

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

O documento foi atualizado com sucesso.