In dit artikel gaan we in op het uitvoeren van basisquerybewerkingen in MongoDB. We produceren nu in een ongeëvenaard tempo gegevens als gevolg van de wereldwijde verspreiding van internet. Aangezien we de vereiste gegevens uit de database moeten verzamelen/opvragen om een soort analyse uit te voeren, is het van het grootste belang dat we de juiste tool kiezen om de gegevens op te vragen.
Dit is waar MongoDB specifiek om de hoek komt kijken. MongoDB is een ongestructureerde database waarin gegevens in de vorm van documenten worden opgeslagen. Bovendien is MongoDB zeer effectief in het verwerken van enorme hoeveelheden gegevens en is het de meest gebruikte NoSQL-database omdat het een rijke querytaal en veelzijdige en gemakkelijke gegevenstoegang biedt.
Maak een voorbeelddatabase
Voordat we beginnen, zullen we een voorbeelddatabase maken met enkele voorbeeldgegevens om alle bewerkingen uit te voeren.
We zullen een database maken met de naam myDB en zal een collectie maken met de naam orders . Hiervoor zou de verklaring als volgt zijn.
> use myDB
> db.createCollection("orders")
>
MongoDB gebruikt de rijen en kolommen niet. Het slaat de gegevens op in een documentformaat. Een verzameling is een groep documenten.
U kunt alle collecties in een database controleren met behulp van de volgende verklaring.
> use myDB
>show collections
orders
system.indexes
>
Laten we wat documenten invoegen met behulp van de volgende verklaring.
> db.orders.insert([
{
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
])
Een document is het equivalent van een RDBMS-rij. Het hoeft niet in elk document hetzelfde schema te hebben. Het betekent dat een document mogelijk geen veld heeft dat geen waarde heeft.
Documenten opvragen
find() methode
U moet de methode find() gebruiken om documenten uit MongoDB-verzamelingen op te vragen. De volgende verklaring haalt alle documenten uit de collectie.
> db.orders.find()
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 600.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Projectie
Als u alleen geselecteerde velden wilt ophalen, kunt u de projectie gebruiken. De volgende verklaring haalt alleen Klant op en E-mail veld.
> db.orders.find( { }, { Customer: 1, Email: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Email:"[email protected]"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Email:"[email protected]"
}
>
Filter de documenten door een voorwaarde op te geven
Nu zullen we leren hoe we de documenten kunnen ophalen die voldoen aan een gespecificeerde voorwaarde. MongoDB biedt hiervoor veel vergelijkingsoperatoren.
1. $eq-operator
De $eq-operator controleert de gelijkheid van de veldwaarde met de opgegeven waarde. Om de bestelling op te halen waar PaymentMode is 'Card' kunt u de volgende verklaring gebruiken
>db.orders.find( { PaymentMode: { $eq: "Card" } } )
Deze zoekopdracht kan ook zoals hieronder worden geschreven
>db.orders.find( { PaymentMode: "Card" } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE PaymentMode="Card"
Voorbeeld
>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
PaymentMode":"Card"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
PaymentMode":"Card"
}
>
$eq Operator met ingesloten document
Het is je misschien opgevallen dat we een ingesloten document Adres . hebben ingevoegd in de Bestellingen verzameling. Als u de bestelling wilt ophalen waar Land is 'India', dan kun je een puntnotatie gebruiken zoals de volgende verklaring.
>db.Orders.find( { "Address.Country": { $eq: "India" } } )
Deze zoekopdracht kan ook zoals hieronder worden geschreven
>db.Orders.find( { "Address.Country":"India" } )
Voorbeeld
>db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"}
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"}
}
>
$eq Operator met array
$eq-operator haalt alle documenten op als de opgegeven voorwaarde waar is voor elk item in een array. We hebben een OrderItems array in het document. Als u de documenten wilt filteren waar ook 'papier' is besteld, dan ziet de verklaring er als volgt uit.
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )
Deze zoekopdracht kan ook zoals hieronder worden geschreven
>db.Orders.find( { "OrderItems.ItemName": "paper" } )
Voorbeeld
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
2. $gt-operator
U kunt de $gt-operator gebruiken om de documenten op te halen waarvan de waarde van een veld groter is dan de opgegeven waarde. De volgende instructie haalt de documenten op waar OrderTotal is groter dan 800.
>db.orders.find( { OrderTotal: { $gt: 800.00 } } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE OrderTotal>800.00
Voorbeeld
>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
}
>
3. $gte-operator
U kunt de $gte-operator gebruiken om de documenten op te halen waarvan de waarde van een veld groter is dan of gelijk is aan de opgegeven waarde. De volgende instructie haalt de documenten op waar OrderTotal is groter dan of gelijk aan 800.
>db.orders.find( { OrderTotal: { $gte: 800.00 } } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE OrderTotal>=800.00
Voorbeeld
>db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
}
>
4. $lt-operator
U kunt de $lt-operator gebruiken om de documenten op te halen waarvan de waarde van een veld kleiner is dan de opgegeven waarde. De volgende instructie haalt de documenten op waar OrderTotal is minder dan 800.
>db.orders.find( { OrderTotal: { $lt: 800.00 } } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE OrderTotal<800.00
Voorbeeld
>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
4. $lte Operator
U kunt de $lte-operator gebruiken om de documenten op te halen waarvan de waarde van een veld kleiner is dan of gelijk is aan de opgegeven waarde. De volgende verklaring haalt de documenten op waar OrderTotal is kleiner dan of gelijk aan 800.
>db.orders.find( { OrderTotal: { $lte: 800.00 } } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE OrderTotal<=800.00
Voorbeeld
>db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
5. $ne Operator
U kunt de $ne-operator gebruiken om de documenten op te halen waarvan de waarde van een veld niet gelijk is aan de opgegeven waarde.
>db.orders.find( { PaymentMode: { $ne: "Card" } } )
Een vergelijkbare SQL-instructie zou als volgt zijn
SELECT * FROM orders WHERE PaymentMode != "Card"
Voorbeeld
>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
PaymentMode":"Cash"
}
>
6. $in Operator
U kunt de $in-operator gebruiken om de documenten op te halen waarin de waarde van een veld gelijk is aan een willekeurige waarde in de opgegeven matrix.
>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )
Voorbeeld
>db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
7. $nin Operator
U kunt de $nin-operator gebruiken om de documenten op te halen waarvan de waarde van een veld niet gelijk is aan een waarde in de opgegeven matrix. Het zal ook de documenten selecteren waar het veld niet bestaat.
>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )
Voorbeeld
>db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Indexeren
We weten dat indexering erg belangrijk is als we de query's uitvoeren op een grote database. Zonder indexering kan het uitvoeren van een query duur zijn. We kunnen een eenvoudige oplopende index toevoegen aan een enkel veld door de volgende instructie te gebruiken.
>db.Orders.createIndex({"Customer":1})
MongoDB maakt standaard een unieke index op het veld '_id'. Een unieke index voorkomt het invoegen van twee documenten met dezelfde waarde voor dat veld. Als u een unieke index wilt maken, zou de verklaring als volgt zijn.
db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )
Conclusie
Ik hoop dat je vandaag iets nieuws hebt geleerd. Als je nog een paar dingen over MongoDB wilt leren, is hier een interessant artikel over Self-Hosted MongoDB. Ik nodig je ook uit om dingen zelf te proberen en je ervaring te delen in het commentaargedeelte. Bovendien, als u problemen ondervindt met een van de bovenstaande definities, aarzel dan niet om het me te vragen in de opmerkingen hieronder.