sql >> Database >  >> NoSQL >> MongoDB

Fix "$pullAll vereist een array-argument maar kreeg een dubbele" in MongoDB

Als u de opdracht “$pullAll heeft een array-argument nodig, maar een dubbele . heeft gekregen, ”-fout in MongoDB, omdat u geen array hebt opgegeven als de te vervangen waarde.

Voorbeeld

Stel we hebben een collectie met de volgende documenten:

{ "_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 ] }

En we willen $pullAll . gebruiken om alle exemplaren van een waarde in een van die documenten te vervangen.

Probleemcode

Hier is een voorbeeld van code die de bovenstaande fout veroorzaakt:

db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: 7 } } 
)

Resultaat:

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

Dit gebeurde omdat we waren vergeten de waarde 7 te omringen met vierkante haken. Met andere woorden, we zijn vergeten een array op te geven.

Oplossing

Hier is dezelfde code, maar deze keer hebben we de waarde als een array opgegeven:

db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: [ 7 ] } } 
)

Resultaat:

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

Dit laat ons zien dat één document is gematcht en aangepast.

Laten we de collectie nu eens bekijken:

db.foo.find()

Resultaat:

{ "_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 ] }

Het document is succesvol bijgewerkt.


  1. MongoDB $pull

  2. Spring Redis-sorteersleutels

  3. Behouden arrays die zijn opgeslagen in MongoDB hun volgorde?

  4. Beste model voor het vertegenwoordigen van veel tot veel relaties met attributen in MongoDB