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

Come eseguire operazioni di query di base in MongoDB

In questo articolo, tratteremo come eseguire operazioni di query di base in MongoDB. Stiamo producendo dati a un ritmo senza precedenti ora in seguito alla diffusione globale di Internet. Poiché ci richiederà di raccogliere/richiedere i dati richiesti dal database per condurre un qualche tipo di analisi, è della massima importanza scegliere lo strumento giusto per interrogare i dati.

È qui che entra in gioco MongoDB, in particolare. MongoDB è un database non strutturato che, sotto forma di documenti, memorizza i dati. Inoltre, MongoDB è molto efficace nella gestione di enormi quantità di dati ed è il database NoSQL più comunemente utilizzato in quanto fornisce un linguaggio di query avanzato e un accesso ai dati versatile e facile.

Crea un database di esempio

Prima di iniziare, creeremo un DB di esempio con alcuni dati di esempio per eseguire tutte le operazioni.

Creeremo un database con il nome myDB e creerà una collezione con il nome ordini . Per questo, la dichiarazione sarebbe la seguente.

> use myDB
> db.createCollection("orders")
>

MongoDB non utilizza righe e colonne. Memorizza i dati in un formato di documento. Una raccolta è un gruppo di documenti.

Puoi controllare tutte le raccolte in un database utilizzando la seguente istruzione.

> use myDB
>show collections
orders
system.indexes
>

Inseriamo alcuni documenti utilizzando la seguente istruzione.

> 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}
		]		
	}
])

Un documento è l'equivalente di una riga RDBMS. Non è necessario che abbia lo stesso schema in ogni documento. Significa che un documento potrebbe non avere alcun campo che non abbia alcun valore.

Query documenti

metodo trova()

È necessario utilizzare il metodo find() per interrogare i documenti dalle raccolte MongoDB. La seguente dichiarazione recupererà tutti i documenti dalla raccolta.

> 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}
		]
	}
>

Proiezione

Se desideri recuperare solo i campi selezionati, puoi utilizzare la proiezione. La seguente dichiarazione recupererà solo il Cliente e E-mail campo.

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

Filtra i documenti specificando una condizione

Ora impareremo come recuperare i documenti che soddisfano una condizione specificata. MongoDB fornisce molti operatori di confronto per questo.

1. $eq Operatore

L'operatore $eq verifica l'uguaglianza del valore del campo con il valore specificato. Per recuperare l'ordine in cui PaymentMode è 'Carta' puoi utilizzare la seguente istruzione

>db.orders.find( { PaymentMode: { $eq: "Card" } } )

Questa query può essere scritta anche come di seguito

>db.orders.find( { PaymentMode: "Card" } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE PaymentMode="Card"

Esempio

>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		PaymentMode":"Card"				
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		PaymentMode":"Card"
	}
>

Operatore $eq con documento incorporato

Potresti aver notato che abbiamo inserito un documento incorporato Indirizzo negli Ordini collezione. Se vuoi recuperare l'ordine dove Paese è 'India' puoi usare una notazione punto come la seguente affermazione.

>db.Orders.find( { "Address.Country": { $eq: "India" } } )

Questa query può essere scritta anche come di seguito

>db.Orders.find( { "Address.Country":"India" } )

Esempio

>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"}
	}
>

Operatore $eq con array

L'operatore $eq recupererà tutti i documenti se la condizione specificata è vera per qualsiasi elemento in un array. Abbiamo un OrderItems matrice nel documento. Se desideri filtrare i documenti in cui è stata ordinata anche la "carta", la dichiarazione sarebbe la seguente.

>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )

Questa query può essere scritta anche come di seguito

>db.Orders.find( { "OrderItems.ItemName": "paper"  } )

Esempio

>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 Operatore

È possibile utilizzare l'operatore $gt per recuperare i documenti in cui il valore di un campo è maggiore del valore specificato. La seguente istruzione recupererà i documenti in cui Totale ordine è maggiore di 800.

>db.orders.find( { OrderTotal: { $gt: 800.00 } } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE OrderTotal>800.00

Esempio

>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderTotal: 1000.00
	}
>

3. $gte Operatore

È possibile utilizzare l'operatore $gte per recuperare i documenti in cui il valore di un campo è maggiore o uguale al valore specificato. La seguente istruzione recupererà i documenti in cui Totale ordine è maggiore o uguale a 800.

>db.orders.find( { OrderTotal: { $gte: 800.00 } } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE OrderTotal>=800.00

Esempio

>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 Operatore

È possibile utilizzare l'operatore $lt per recuperare i documenti in cui il valore di un campo è inferiore al valore specificato. La seguente istruzione recupererà i documenti in cui Totale ordine è inferiore a 800.

>db.orders.find( { OrderTotal: { $lt: 800.00 } } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE OrderTotal<800.00

Esempio

>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderTotal: 600.00
	}
>

4. $lte Operatore

È possibile utilizzare l'operatore $lte per recuperare i documenti in cui il valore di un campo è inferiore o uguale al valore specificato. La seguente dichiarazione recupererà i documenti in cui Totale ordine è minore o uguale a 800.

>db.orders.find( { OrderTotal: { $lte: 800.00 } } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE OrderTotal<=800.00

Esempio

>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 Operatore

Puoi utilizzare l'operatore $ne per recuperare i documenti in cui il valore di un campo non è uguale al valore specificato.

>db.orders.find( { PaymentMode: { $ne: "Card" } } )

Un'istruzione SQL simile sarebbe la seguente

SELECT * FROM orders WHERE PaymentMode != "Card"

Esempio

>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		PaymentMode":"Cash"
	}
>

6. $ in Operatore

Puoi utilizzare l'operatore $in per recuperare i documenti in cui il valore di un campo è uguale a qualsiasi valore nell'array specificato.

>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )

Esempio

>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. Operatore $9

È possibile utilizzare l'operatore $nin per recuperare i documenti in cui il valore di un campo non è uguale a nessun valore nell'array specificato. Selezionerà anche i documenti in cui il campo non esiste.

>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )

Esempio

>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}
		]
	}
>

Indicizzazione

Sappiamo che l'indicizzazione è molto importante se eseguiamo le query su un database di grandi dimensioni. Senza l'indicizzazione, l'esecuzione di una query può essere costosa. Possiamo aggiungere un semplice indice crescente su un singolo campo usando la seguente istruzione.

>db.Orders.createIndex({"Customer":1})

MongoDB crea un indice univoco sul campo '_id' per impostazione predefinita. Un indice univoco impedirà l'inserimento di due documenti con lo stesso valore per quel campo. Se vuoi creare un indice univoco, l'istruzione sarebbe la seguente.

db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )

Conclusione

Spero che tu abbia imparato qualcosa di nuovo oggi, se vuoi imparare qualche altra cosa su MongoDB, ecco un articolo interessante su MongoDB self-hosted. Ti invito anche a provare cose da solo e condividere la tua esperienza nella sezione commenti. Inoltre, se dovessi riscontrare problemi con una qualsiasi delle definizioni di cui sopra, non esitare a chiedermelo nei commenti qui sotto.