sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $addToSet

I MongoDB, $addToSet operatorn lägger till ett värde till en array om inte värdet redan finns i arrayen.

Det liknar $push operator, förutom att $push lägger till värdet även om värdet redan finns.

Exempel

Anta att vi har en samling som heter products med följande dokument:

db.products.find()

Resultat:

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

Vi kan använda $addToSet för att lägga till ett värde till en av dessa arrayer.

Exempel:

db.products.update(
   { _id: 1 },
   { $addToSet: { sizes: "XL" } }
)

Utdata:

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

Låt oss ta en ny titt på vår samling för att verifiera ändringen:

db.products.find()

Resultat:

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

Duplicera värden

Om du försöker infoga ett värde som redan finns i arrayen händer ingenting. Med andra ord, $addToSet infogar bara värdet om det inte redan finns.

Här är ett exempel på ett försök att infoga ett värde som redan finns.

db.products.update(
   { _id: 1 },
   { $addToSet: { sizes: "XL" } }
)

Utdata:

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

Det här meddelandet talar om för oss att det fanns ett matchande dokument (d.v.s. dokumentet med ett _id av 1 ), men det gjordes inga ändringar.

I föregående exempel såg vi "nModified" : 1 , men i det här exemplet ser vi "nModified" : 0 . Det beror på att värdet inte fanns när vi infogade det i föregående exempel, men i det här exemplet finns det redan.

Vi kan verifiera detta genom att titta på samlingen igen:

db.products.find()

Resultat:

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

Lägg till flera värden

Du kan använda $each modifierare för att lägga till flera värden till en array.

Exempel:

db.products.update(
   { _id: 2 },
   { 
     $addToSet: { 
        sizes: {
           $each: [ "XXL", "XXXL" ]
        }
      } 
    }
)

Utdata:

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

Låt oss nu kontrollera samlingen igen:

db.products.find()

Resultat:

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

Vi kan se att de två värdena lades till arrayen i dokument 2 som förväntat.

Lägg till en array i arrayen

Du kan också lägga till en hel array till arrayen. När du gör detta läggs hela arrayen till som en egen separat array.

Anta att vi har en sådan här samling:

db.foo.find()

Resultat:

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

Vi kan lägga till en array till en array så här:

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

Utdata:

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

Kontrollera samlingen:

db.foo.find()

Resultat:

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


  1. Det går inte att deserialisera PyMongo ObjectId från JSON

  2. RDBTools har köpts upp av RedisLabs!

  3. 3 sätt att returnera ett slumpmässigt urval av dokument från en MongoDB-samling

  4. Redis startar inte som Windows-tjänst på Windows7