sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $skub

I MongoDB kan du bruge $push operator for at tilføje en værdi til en matrix.

Du kan bruge forskellige modifikatorer til at angive værdiens position i arrayet, rækkefølgen af ​​elementerne i arrayet, tilføje flere værdier osv.

Eksempel

Antag, at vi har en samling kaldet products med følgende dokumenter:

db.products.find() 

Resultat:

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

Og lad os sige, at vi ønsker at tilføje en værdi til arrayet i dokument 3.

Vi kan bruge $push i forbindelse med update() for at tilføje værdien:

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

Output:

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

Lad os se på samlingen igen for at bekræfte ændringen:

db.products.find() 

Resultat:

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

Indsæt værdien på en bestemt position

Du kan bruge $each og $position modifikatorer for at angive, hvor værdien skal indsættes i arrayet.

For eksempel kan vi bruge en værdi på 0 for at indsætte det i starten af ​​arrayet.

Eksempel:

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

Output:

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

$each modifier tilføjer flere værdier til matrixfeltet. I dette tilfælde indsatte vi kun én værdi i arrayet, men for at bruge $position modifikator, skal den vises med $each modifikator.

Lad os tjekke samlingen igen:

db.products.find() 

Resultat:

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

Tilføj og sorter

Antag, at vi har en samling med følgende dokumenter:

db.players.find() 

Resultat:

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

Og antag, at vi vil tilføje nogle værdier til arrayet i dokument 3, men vi vil også sortere arrayet i stigende rækkefølge, efter at vi har tilføjet værdien.

Vi kan gøre dette:

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

Output:

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

Når vi nu ser samlingen, kan vi se, at det tredje dokument er blevet ændret i overensstemmelse hermed.

db.players.find() 

Resultat:

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

For at sortere det i faldende rækkefølge, brug $sort: -1 .

Skær arrayet i skiver

Du kan bruge $slice modifikator for at begrænse antallet af elementer i arrayet.

Lad os f.eks. tilføje en anden værdi til arrayet, men derefter opdele arrayet til et bestemt antal elementer.

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

Output:

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

Lad os nu tjekke samlingen igen:

db.players.find() 

Resultat:

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

I dette tilfælde blev arrayet skåret i skiver, men den værdi, som vi tilføjede, endte ikke engang i det endelige array. Dette skyldes, at værdien blev tilføjet til arrayet, og vi brugte ikke en $sort operation, og værdien forblev således i slutningen af ​​arrayet, før arrayet blev skåret til dets første tre elementer.

Her er den igen, bortset fra denne gang med $sort modifikator.

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

Output:

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

Tjek samlingen:

db.players.find() 

Resultat:

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

Tilføj kun værdi, hvis den ikke eksisterer

Hvis du kun ønsker, at værdien skal tilføjes, hvis den ikke allerede findes i arrayet, så overvej at bruge $addToSet operatør.


  1. SCUMM:Den agentbaserede databaseovervågningsinfrastruktur i ClusterControl

  2. Design af en applikation med Redis som datalager. Hvad? Hvorfor?

  3. Kan ikke autentificere på mongodb med PHP

  4. Begræns listens længde i redis