sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man hanterar dokument i MongoDB


Introduktion

När du använder MongoDB kommer du att spendera det mesta av din tid med att hantera dokument på ett eller annat sätt. Oavsett om du skapar nya dokument och lägger till dem i samlingar, hämtar dokument, uppdaterar data eller beskär inaktuella föremål, är dokument i centrum för MongoDB-modellen.

I den här guiden kommer vi att täcka vad MongoDB-dokument är och sedan täcka de vanliga operationerna som du förmodligen behöver veta om för att hantera en dokumentcentrerad miljö.



Vad är MongoDB-dokument?

I MongoDB lagras all data inom databaser och samlingar i dokument. Eftersom samlingar inte anger ett obligatoriskt schema som standard, kan dokument inom en samling innehålla en godtyckligt komplex struktur och behöver inte matcha formatet som används av syskondokument. Detta ger otrolig flexibilitet och gör att schemat kan utvecklas organiskt när applikationskraven ändras.

MongoDB-dokument använder själva BSON-dataserialiseringsformatet, en binär representation av JSON JavaScript Object Notation. Detta ger en organiserad struktur med definierade datatyper som kan frågas och hanteras programmatiskt.

BSON-dokument representeras av ett par hängslen ({} ) som innehåller nyckel-värdepar. I BSON är dessa datakupletter kända som fältet och dess värde . Fältet kommer först och representeras av en sträng. Värdet kan vara vilken giltig BSON-datatyp som helst. Ett kolon (: ) skiljer fältet från dess värde. Ett kommatecken används för att separera varje fält och värdepar från varandra.

Som ett exempel, här är ett giltigt BSON-dokument som MongoDB kan förstå:

{    _id: 80380,    vehicle_type: "car",    mileage: 7377.80,    color: "blue",    markets: [        "US",        "UK"    ],    options: {        transmission: "automatic",        num_doors: 4,        power_windows: true    }}

Här kan vi se en hel del typer:

  • _id är ett heltal
  • vehicle_type och color är strängar
  • mileage är en flöte
  • markets är en rad strängar
  • options innehåller ett kapslat dokument med värden som består av en sträng, ett heltal och en boolesk

På grund av denna flexibilitet är dokument ett ganska flexibelt medium för att lagra data. Nya fält kan enkelt läggas till, dokument kan bäddas in i varandra och den strukturella komplexiteten matchar exakt den data som lagras.



Så skapar du nya dokument

För att skapa ett nytt dokument, byt till en databas där du vill lagra det skapade dokumentet. Vi använder en school databas för demonstrationsändamål i denna artikel:

use school

Du vill också välja den samling där du vill infoga dokumenten. Som med databaser behöver du inte uttryckligen skapa samlingen där du vill infoga dokumentet. MongoDB kommer automatiskt att skapa den när den första datan skrivs. För det här exemplet använder vi en samling som heter students .

Nu när du vet var dokumentet kommer att lagras kan du infoga ett nytt dokument med någon av följande metoder.


Använda insert() metod

insert() metoden låter dig infoga ett eller flera dokument i samlingen den anropas.

För att infoga ett enstaka dokument, skicka dokumentet till metoden genom att anropa det på samlingen. Här infogar vi ett nytt dokument för en elev som heter Ashley:

db.students.insert(    {        first_name: "Ashley",        last_name: "Jenkins",        dob: new Date("January 08, 2003"),        grade_level: 8    })
WriteResult({ "nInserted" : 1 })

Om du vill infoga mer än ett dokument samtidigt, istället för att skicka ett dokument till insert() , skicka en mängd dokument. Vi kan lägga till två nya dokument för elever som heter Brian och Leah:

db.students.insert(    [        {            first_name: "Brian",            last_name: "McMantis",            dob: new Date("September 18, 2010"),            grade_level: 2        },        {            first_name: "Leah",            last_name: "Drake",            dob: new Date("October 03, 2009")        }    ])
BulkWriteResult({        "writeErrors" : [ ],        "writeConcernErrors" : [ ],        "nInserted" : 2,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})

Eftersom vi utförde en bulkskrivoperation är vårt returvärde ett BulkWriteResult istället för WriteResult objekt vi såg tidigare.

Medan insert() Metoden är flexibel, den har föråldrats i många MongoDB-drivrutiner till förmån för följande två metoder.



Använda insertOne() metod

insertOne() metod kan användas för att infoga ett enda dokument. Till skillnad från insert() metod kan den bara infoga ett dokument åt gången, vilket gör dess beteende lite mer förutsägbart.

Syntaxen är densamma som när du använder insert() för att lägga till ett enda dokument. Vi kan lägga till ytterligare en elev som heter Naomi:

db.students.insertOne(    {        first_name: "Naomi",        last_name: "Pyani"    })
{        "acknowledged" : true,        "insertedId" : ObjectId("60e877914655cbf49ff7cb86")}

Till skillnad från insert() , insertOne() metod returnerar ett dokument som innehåller ytterligare användbar information. Den bekräftar att skrivningen bekräftades av klustret och den inkluderar objekt-ID:t som tilldelades dokumentet eftersom vi inte tillhandahöll ett.



Använda insertMany() metod

För att täcka scenarier där du vill infoga flera dokument samtidigt, insertMany() metod rekommenderas nu. Precis som när du infogar flera dokument med insert() , insertMany() tar en mängd dokument.

Vi kan lägga till tre nya elever som heter Jasmine, Michael och Toni:

db.students.insertMany(    [        {            first_name: "Jasmine",            last_name: "Took",            dob: new Date("April 11, 2011")        },        {            first_name: "Michael",            last_name: "Rodgers",            dob: new Date("February 25, 2008"),            grade_level: 6        },        {            first_name: "Toni",            last_name: "Fowler"        }    ])
{        "acknowledged" : true,        "insertedIds" : [                ObjectId("60e8792d4655cbf49ff7cb87"),                ObjectId("60e8792d4655cbf49ff7cb88"),                ObjectId("60e8792d4655cbf49ff7cb89")        ]}

Som med insertOne() , insertMany() returnerar ett dokument som bekräftar skrivningen och tillhandahåller en array som innehåller de ID:n som har tilldelats de infogade dokumenten.




Så här frågar du efter befintliga dokument

Att fråga efter dokument är ett ganska omfattande ämne som motiverar en egen artikel. Du kan hitta detaljer om hur du formulerar frågor för att hämta olika typer av dokument i vår guide om att söka efter data inom MongoDB.

Även om detaljerna bäst lämnas i artikeln som länkas ovan, kan vi åtminstone täcka de metoder som MongoDB tillhandahåller för att fråga efter dokument. Det huvudsakliga sättet att hämta dokument från MongoDB är genom att anropa find() metod på den aktuella samlingen.

Till exempel för att samla in alla dokument från students , kan du anropa find() utan argument:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

För att göra utdata mer läsbar kan du också kedja pretty() metod efter find() :

db.<collection>.find().pretty()
{        "_id" : ObjectId("60e8743b4655cbf49ff7cb83"),        "first_name" : "Ashley",        "last_name" : "Jenkins",        "dob" : ISODate("2003-01-08T00:00:00Z"),        "grade_level" : 8}{        "_id" : ObjectId("60e875d54655cbf49ff7cb84"),        "first_name" : "Brian",        "last_name" : "McMantis",        "dob" : ISODate("2010-09-18T00:00:00Z"),        "grade_level" : 2}{        "_id" : ObjectId("60e875d54655cbf49ff7cb85"),        "first_name" : "Leah",        "last_name" : "Drake",        "dob" : ISODate("2009-10-03T00:00:00Z")}{        "_id" : ObjectId("60e877914655cbf49ff7cb86"),        "first_name" : "Naomi",        "last_name" : "Pyani"}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb87"),        "first_name" : "Jasmine",        "last_name" : "Took",        "dob" : ISODate("2011-04-11T00:00:00Z")}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb88"),        "first_name" : "Michael",        "last_name" : "Rodgers",        "dob" : ISODate("2008-02-25T00:00:00Z"),       "grade_level" : 6}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb89"),        "first_name" : "Toni",        "last_name" : "Fowler"}

Du kan se att ett _id fältet har lagts till i vart och ett av dokumenten. MongoDB kräver ett unikt _id för varje dokument i en samling. Om du inte tillhandahåller ett när objekt skapas, kommer det att lägga till ett åt dig. Du kan använda detta ID för att hämta ett enstaka objekt på ett tillförlitligt sätt:

db.students.find(    {        _id : ObjectId("60e8792d4655cbf49ff7cb89")    })
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

Du kan ta reda på mer om olika sätt att söka efter data med artikeln som länkas ovan.



Hur man uppdaterar befintliga dokument

Många eller de flesta användningsfall för databaser kräver att du kan modifiera befintliga data i databasen. Ett fält kan behöva uppdateras för att återspegla ett nytt värde eller så kan du behöva lägga till ytterligare information till ett befintligt dokument när det blir tillgängligt.

MongoDB använder några relaterade metoder för att uppdatera befintliga dokument:

  • updateOne() :Uppdaterar ett enskilt dokument inom en samling baserat på det medföljande filtret.
  • updateMany() :Uppdaterar flera dokument inom en samling som matchar det angivna filtret.
  • replaceOne() :Ersätter ett helt dokument i en samling baserat på det medföljande filtret.

Vi kommer att täcka hur man använder var och en av dessa varianter för att utföra olika typer av uppdateringar.


Uppdatera operatorer

Innan vi tar en titt på var och en av metoderna för att uppdatera dokument bör vi gå igenom några av de uppdateringsoperatörer som finns tillgängliga.

  • $currentDate :Anger ett fälts värde till det aktuella datumet, antingen som en datum- eller tidsstämpeltyp.
    • Syntax:{ $currentDate: { <field>: <type>, ... } }
  • $inc :Ökar ett fälts värde med ett visst belopp.
    • Syntax:{ $inc: { <field>: <amount>, ... } }
  • $min :Uppdaterar ett fälts värde om det angivna värdet är mindre än det aktuella värdet.
    • Syntax:{ $min: { <field>: <value>, ... } }
  • $max :Uppdaterar ett fälts värde om det angivna värdet är högre än det aktuella värdet.
    • Syntax:{ $max: { <field>: <value>, ... } }
  • $mul :Uppdaterar ett fälts värde genom att multiplicera det med det angivna talet.
    • Syntax:{ $mul: { <field>: <value>, ... } }
  • $rename :Byter namn på ett fältnamn till en ny identifierare.
    • Syntax:{ $rename: { <field>: <new_name>, ... } }
  • $set :Ersätter värdet för ett fält med det angivna värdet.
    • Syntax:{ $set: { <field>: value, ... } }
  • $setOnInsert :Under upsert-operationer, ställer in värdet på ett fält om ett nytt dokument skapas och gör inget annat.
    • Syntax:{ $setOnInsert: { <field>: <value>, ... } }
  • $unset :Tar bort ett fält från dokumentet.
    • Syntax:{ $unset: { <field>: "", ... } }
  • $ :En platshållare för det första arrayelementet som uppfyller frågan.
    • Syntax:{ <update_operator>: {<array>.$: <value> } }
  • $[] :En platshållare för alla arrayelement som uppfyller frågan.
    • Syntax:{ <update_operator>: { <array>.$[]: <value> } }
  • $addToSet :Lägger till värden till arrayen om de inte redan finns.
    • Syntax:{ $addToSet: { <field>: <value>, ... } }
  • $pop :Tar bort det första eller sista elementet i en array.
    • Syntax:{ $pop: { <field>: (-1 or 1), ... } }
  • $pull :Tar bort alla element i en array som matchar ett villkor.
    • Syntax:{ $pull: { <field>: <condition>, ... } }
  • $push :Lägger till ett värde till en array.
    • Syntax:{ $push: { <field>: <value>, ... } }
  • $pullAll :Tar bort alla angivna element från en array.
    • Syntax:{ $pullAll: { <field>: [ <value>, ... ], ...} }
  • $each :Ändrar $addToSet och $push operatorer så att de lägger till varje element i en array istället för en array som ett enda element.
    • Syntax:{ <update_operator>: { <field>: { $each: [ <value>, ... ] }, ... } }
  • $position :Används med $each och anger positionen $push operatören ska infoga vid.
    • Syntax:{ $push: { <field>: { $each: [ <value>, ... ], $position: <num> } } }
  • $slice :Används med $each och $push för att begränsa antalet totala element i arrayen.
    • Syntax:{ $push: { <field>: { $each: [ <value>, ... ], $slice: <num> } } }
  • $sort :Används med $each och $push för att sortera arrayelement.
    • Syntax:{ $push: { <field>: { $each: [ <value>, ... ], $sort: <sort_order> } } }

Dessa olika uppdateringsoperatörer låter dig uppdatera olika fält i dina dokument på olika sätt.



Uppdatera ett enstaka dokument i en samling

MongoDB:s updateOne() metod används för att uppdatera ett enda dokument i en samling. Metoden tar två obligatoriska argument samt ett dokument som anger valfria argument.

Det första argumentet är ett dokument som specificerar filtervillkoren som kommer att användas för att välja dokument. Sedan updateOne() metoden modifierar högst ett dokument i en samling, det första dokumentet som uppfyller filtervillkoren kommer att användas.

Det andra argumentet anger uppdateringsoperationen som ska utföras. Uppdateringsoperationerna ovan kan specificeras här för att ändra innehållet i det matchade dokumentet.

Det tredje argumentet är ett dokument med olika alternativ för att ändra metodens beteende. De viktigaste potentiella värdena är:

  • upsert :Förvandlar operationen till en upprepningsprocedur genom att infoga ett nytt dokument om filtret inte matchar några befintliga dokument.
  • collation :Ett dokument som definierar språkspecifika regler som ska gälla för operationen.

Som ett exempel kan vi uppdatera en enskild studentpost som vi filtrerar efter _id för att säkerställa att vi riktar in oss på rätt dokument. Vi kan ställa in grade_level till ett nytt värde:

db.students.updateOne(    { _id: ObjectId("60e8792d4655cbf49ff7cb89") },    { $set: { grade_level: 3 } })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }


Uppdatera flera dokument i en samling

MongoDB:s updateMany() Metoden fungerar på samma sätt som updateOne() metod, utan uppdaterar istället alla dokument som matchar det givna filtret istället för att stoppa efter den första matchningen.

updateMany() syntaxen följer exakt updateOne() syntax, så den enda skillnaden är operationens omfattning.

Som ett exempel, om vi vill ändra alla instanser av "komposition" till "skrivande" i subjects array i våra teachers insamlingsdokument, kan vi använda något sånt här:

db.teachers.updateMany(    { subject: "composition" },    { $set: { "subjects.$": "writing" } })
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Om du kontrollerar dokumenten borde varje instans av "komposition" ha ersatts med "skrivande":

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }


Byta ut ett dokument

replaceOne() Metoden fungerar på samma sätt som updateOne() metod, men ersätter hela dokumentet istället för att uppdatera enskilda fält. Syntaxen är densamma som de två föregående kommandona.

Till exempel, om Nancy Smith lämnar din skola och du ersätter henne med en lärare som heter Clara Newman som undervisar i litteratur, kan du skriva följande:

db.teachers.replaceOne(    {        $and: [             { first_name: "Nancy" },            { last_name: "Smith" }        ]    },    {        first_name: "Clara",        last_name: "Newman",        subjects: [ "literature" ]    })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

Du kan se att det matchade dokumentet har tagits bort och att det angivna dokumentet har ersatt det:

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Clara", "last_name" : "Newman", "subjects" : [ "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }



Hur man tar bort dokument

Att ta bort dokument från samlingar är också en del av dokumentets livscykel. För att ta bort ett dokument kan du använda deleteOne() eller deleteMany() metoder. De har samma syntax och skiljer sig bara i hur många dokument de arbetar på.

För det mesta, allt du behöver göra för att ta bort dokument med någon av dessa metoder är att förse det med ett filterdokument som anger hur du vill välja det dokument som ska tas bort. deleteOne() metod kommer att radera högst ett dokument (oavsett hur många matchningar filtret producerar) medan deleteMany() metod tar bort alla dokument som matchar filtervillkoren.

Om du till exempel vill ta bort en enskild elev kan du ange ett _id för att explicit matcha dem:

db.students.deleteOne({    _id: ObjectId("60e8792d4655cbf49ff7cb87")})
{ "acknowledged" : true, "deletedCount" : 1 }

Om vi ​​vill ta bort någon elev som inte har en betygsnivå tilldelad kan vi använda deleteMany() metod istället:

db.students.deleteMany({    grade_level: { $eq: null }})
{ "acknowledged" : true, "deletedCount" : 2 }

Om vi ​​kontrollerar bör vi se att alla återstående elever har en betygsnivå tilldelad:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler", "grade_level" : 3 }


Slutsats

Att lära sig att skapa, fråga efter, uppdatera och ta bort dokument ger dig de färdigheter du behöver för att effektivt hantera dokument inom MongoDB dagligen. Att bli bekant med de olika dokument- och insamlingsmetoderna och de operatörer som låter dig matcha och modifiera information låter dig uttrycka komplexa tankar som databassystemet kan förstå.




  1. Percona Live 2017 - Severalnines Recap

  2. Fråga inbäddade objekt i Mongoid/rails 3 (Lägre än, Min-operatorer och sortering)

  3. sparar bild till mongodb

  4. Hur man ogiltigförklarar delar av en hierarki (träd) av data i Redis cache