I den här artikeln kommer vi att ta upp hur man utför grundläggande frågeoperationer i MongoDB. Vi producerar data i en oöverträffad takt nu efter den globala spridningen av internet. Eftersom det kommer att kräva att vi samlar in/begär erforderlig data från databasen för att utföra någon form av analys, är det av yttersta vikt att vi väljer rätt verktyg för att fråga efter data.
Det är här MongoDB kommer in, specifikt. MongoDB är en ostrukturerad databas som i form av dokument lagrar data. Dessutom är MongoDB mycket effektivt för att hantera enorma mängder data och är den mest använda NoSQL-databasen eftersom den ger ett rikt frågespråk och mångsidig och enkel dataåtkomst.
Skapa en exempeldatabas
Innan starten kommer vi att skapa en exempel-DB med några exempeldata för att utföra alla operationer.
Vi kommer att skapa en databas med namnet myDB och kommer att skapa en samling med namn order . För detta skulle uttalandet vara följande.
> use myDB
> db.createCollection("orders")
>
MongoDB använder inte raderna och kolumnerna. Den lagrar data i ett dokumentformat. En samling är en grupp av dokument.
Du kan kontrollera alla samlingar i en databas genom att använda följande sats.
> use myDB
>show collections
orders
system.indexes
>
Låt oss infoga några dokument genom att använda följande uttalande.
> 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}
]
}
])
Ett dokument är motsvarigheten till en RDBMS-rad. Det behöver inte ha samma schema i varje dokument. Det betyder att ett dokument kanske inte har något fält som inte har något värde.
Frågedokument
find()-metoden
Du måste använda metoden find() för att söka efter dokument från MongoDB-samlingar. Följande uttalande kommer att hämta alla dokument från samlingen.
> 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}
]
}
>
Projektion
Om du bara vill hämta utvalda fält kan du använda projektionen. Följande uttalande hämtar endast Kund och E-post fältet.
> 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]"
}
>
Filtrera dokumenten genom att ange ett villkor
Nu ska vi lära oss hur vi kan hämta de dokument som matchar ett specificerat villkor. MongoDB tillhandahåller många jämförelseoperatorer för detta.
1. $eq-operatör
$eq-operatorn kontrollerar likheten mellan fältvärdet och det angivna värdet. För att hämta beställningen där Betalningsläge är 'Kort' kan du använda följande uttalande
>db.orders.find( { PaymentMode: { $eq: "Card" } } )
Denna fråga kan också skrivas som nedan
>db.orders.find( { PaymentMode: "Card" } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE PaymentMode="Card"
Exempel
>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 med inbäddat dokument
Du kanske har märkt att vi infogade ett inbäddat dokument Adress i Beställningar samling. Om du vill hämta beställningen var Land är 'Indien' kan du använda en punktnotation som följande påstående.
>db.Orders.find( { "Address.Country": { $eq: "India" } } )
Denna fråga kan också skrivas som nedan
>db.Orders.find( { "Address.Country":"India" } )
Exempel
>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 med array
$eq-operatorn kommer att hämta alla dokument om det angivna villkoret är sant för något objekt i en array. Vi har en OrderItems array i dokumentet. Om du vill filtrera dokumenten där "papper" också beställdes så skulle uttalandet vara som följer.
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )
Denna fråga kan också skrivas som nedan
>db.Orders.find( { "OrderItems.ItemName": "paper" } )
Exempel
>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 Operatör
Du kan använda operatorn $gt för att hämta dokument där ett fälts värde är större än det angivna värdet. Följande uttalande hämtar dokumenten där OrderTotal är större än 800.
>db.orders.find( { OrderTotal: { $gt: 800.00 } } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE OrderTotal>800.00
Exempel
>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
}
>
3. $gte Operatör
Du kan använda operatorn $gte för att hämta dokument där ett fälts värde är större än eller lika med det angivna värdet. Följande uttalande hämtar dokumenten där OrderTotal är större än eller lika med 800.
>db.orders.find( { OrderTotal: { $gte: 800.00 } } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE OrderTotal>=800.00
Exempel
>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 Operatör
Du kan använda operatorn $lt för att hämta dokument där ett fälts värde är mindre än det angivna värdet. Följande uttalande hämtar dokumenten där OrderTotal är mindre än 800.
>db.orders.find( { OrderTotal: { $lt: 800.00 } } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE OrderTotal<800.00
Exempel
>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
4. $lte-operatör
Du kan använda operatorn $lte för att hämta dokument där ett fälts värde är mindre än eller lika med det angivna värdet. Följande uttalande kommer att hämta dokumenten där OrderTotal är mindre än eller lika med 800.
>db.orders.find( { OrderTotal: { $lte: 800.00 } } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE OrderTotal<=800.00
Exempel
>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 Operatör
Du kan använda operatorn $ne för att hämta dokument där ett fälts värde inte är lika med det angivna värdet.
>db.orders.find( { PaymentMode: { $ne: "Card" } } )
En liknande SQL-sats skulle vara följande
SELECT * FROM orders WHERE PaymentMode != "Card"
Exempel
>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
PaymentMode":"Cash"
}
>
6. $in Operator
Du kan använda operatorn $in för att hämta dokument där ett fälts värde är lika med valfritt värde i den angivna arrayen.
>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )
Exempel
>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 Operatör
Du kan använda operatorn $nin för att hämta dokument där ett fälts värde inte är lika med något värde i den angivna arrayen. Det kommer också att välja de dokument där fältet inte finns.
>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )
Exempel
>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}
]
}
>
Indexering
Vi vet att indexering är mycket viktigt om vi utför frågorna på en stor databas. Utan indexering kan det bli dyrt att köra en fråga. Vi kan lägga till ett enkelt stigande index på ett enda fält genom att använda följande sats.
>db.Orders.createIndex({"Customer":1})
MongoDB skapar ett unikt index på '_id'-fältet som standard. Ett unikt index förhindrar att två dokument med samma värde för det fältet infogas. Om du vill skapa ett unikt index så skulle satsen vara som följer.
db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )
Slutsats
Jag hoppas att du lärde dig något nytt idag, om du vill lära dig lite mer saker på MongoDB, här är en intressant artikel om Self-Hosted MongoDB. Jag inbjuder dig också att prova saker på egen hand och dela dina erfarenheter i kommentarsektionen. Dessutom, om du stöter på några problem med någon av definitionerna ovan får du gärna fråga mig i kommentarerna nedan.