Na początku trzeba wyjaśnić że baza MongoDB jest lekko odmienna od innych baz.
To co w innych bazach nazywamy tabelami tu nazywamy kolekcjami (Collections). Kolumny nazywamy polami (Field). jest jeszcze kilka innych różnic ale to będziemy wyjaśniać w trakcie poznawania bazy (najważniejsze różnice przedstawia poniższa tabelka).
RDBMS MongoDB ---------------------------------- Database Database Table Collection Tuple/Row Document column Field Table Join Embedded Documents Primary Key Primary Key (Default key _id provided by mongodb itself) Database Server and Client ---------------------------- Mysqld/Oracle mongod mysql/sqlplus mongo
Skoro już nam udało się uruchomić bazę poleceniem:
[root@localhost etc]# sudo service mongod start
Redirecting to /bin/systemctl start mongod.service
Możemy się do niej podłączyć
[root@localhost mongo]# mongo
MongoDB shell version v3.5.13 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.5.13 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-11-12T19:52:53.895+0100 I CONTROL [initandlisten] 2017-11-12T19:52:53.895+0100 I CONTROL [initandlisten] ** NOTE: This is a development version (3.5.13) of MongoDB. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** Not recommended for production. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-11-12T19:52:53.896+0100 I CONTROL [initandlisten] 2017-11-12T19:53:11.417+0100 E - [main] Error loading history file: FileOpenFailed: Unable to fopen() file /root/.dbshell: No such file or directory >
Na początek wyświetlimy informację o samym serwerze:
> db.hostInfo()
{ "system" : { "currentTime" : ISODate("2017-11-12T18:58:26.611Z"), "hostname" : "localhost.localdomain", "cpuAddrSize" : 64, "memSizeMB" : 990, "numCores" : 1, "cpuArch" : "x86_64", "numaEnabled" : false }, "os" : { "type" : "Linux", "name" : "Oracle Linux Server release 7.3", "version" : "Kernel 4.1.12-61.1.18.el7uek.x86_64" }, "extra" : { "versionString" : "Linux version 4.1.12-61.1.18.el7uek.x86_64 (mockbuild@) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #2 SMP Fri Nov 4 15:48:30 PDT 2016", "libcVersion" : "2.17", "kernelVersion" : "4.1.12-61.1.18.el7uek.x86_64", "cpuFrequencyMHz" : "2294.692", "cpuFeatures" : "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch avx2 rdseed", "pageSize" : NumberLong(4096), "numPages" : 253671, "maxOpenFiles" : 64000 }, "ok" : 1 }
Aby wyświetlić listę baz w instancji wykonujemy polecenie:
> db.adminCommand('listDatabases')
{ "databases" : [ { "name" : "admin", "sizeOnDisk" : 32768, "empty" : false }, { "name" : "local", "sizeOnDisk" : 65536, "empty" : false } ], "totalSize" : 98304, "ok" : 1 }
Może trochę w dziwmy sposób, ale zwraca nam listę baz wraz z rozmiarami poszczególnych baz oraz globalny rozmiar instancji.
Jeśli nas interesuje tylko lista samych baz to
> db.adminCommand( { listDatabases: 1, nameOnly: true} )
{ "databases" : [ { "name" : "admin" }, { "name" : "local" } ], "ok" : 1 }
lub
> db.getMongo().getDBNames()
[ "admin", "local" ]
lub jeszcze prościej 🙂
> show databases
lub
> show dbs
admin 0.000GB local 0.000GB
Aby podłączyć się do konkretnej bazy wykonujemy polecenie:
> use mydb
switched to db mydb
UWAGA !!! Jeśli podana przez nas w poleceniu „use nazwa_bazy” nie istnieje to i tak do bazy zostaniemy podłączeniu i po wykonaniu INSERT’a do bazy taka baza zostanie utworzona.
Aby podczas pracy sprawdzić do jakiej bazy jesteśmy podłączeniu wykonujemy proste polecenie
> db
mydb
Tak więc podłączyliśmy się do bazy MyDB, która nie istnieje.
> show dbs
admin 0.000GB local 0.000GB
INSERT DO KOLEKCJI (COLLECTION)
Spróbujemy coś dopisać do naszej nowej tabeli zwanej tu kolekcją.
> show tables
> show collections
na razie nic nam nie zwraca bo nie ma jeszcze tabel
> db.movie.insert({name:"Wojna Domowa", year:1976})
WriteResult({ "nInserted" : 1 })
Baza MyDB została utworzona
> show dbs
admin 0.000GB local 0.000GB mydb 0.000GB
Dopiszemy jeszcze jeden wiersz
> db.movie.insert({name:"Wild Hogs", year:2005})
WriteResult({ "nInserted" : 1 })
> show collections
movie
to samo wykonuje polecenie np:
> db.movie.save({name:"Kingsajz", year:1997})
> db.movie.save({name:"Faceci w czerni", year:2009})
WriteResult({ "nInserted" : 1 })
Wyświetlenie całej kolekcji MOVIE
> db.movie.find()
{ "_id" : ObjectId("5a08c38b0196d2a804e6515e"), "name" : "Wojna Domowa", "year" : 1976 } { "_id" : ObjectId("5a08c3920196d2a804e6515f"), "name" : "Wild Hogs", "year" : 2005 } { "_id" : ObjectId("5a08c3980196d2a804e65160"), "name" : "Kingsajz", "year" : 1997 } { "_id" : ObjectId("5a08c39e0196d2a804e65161"), "name" : "Faceci w czerni", "year" : 2009 }
lub inaczej
> db.movie.find().toArray()
[ { "_id" : ObjectId("5a08c3980196d2a804e65160"), "name" : "Kingsajz", "year" : 1997 }, { "_id" : ObjectId("5a08c39e0196d2a804e65161"), "name" : "Faceci w czerni", "year" : 2009 }, { "_id" : ObjectId("5a08c4b30196d2a804e65162"), "name" : "Wild Hogs", "year" : 2010 } ]
Wyświetlenie tylko jednego wiersza z kolekcji MOVIE
> db.movie.find().limit(1)
{ "_id" : ObjectId("5a08c38b0196d2a804e6515e"), "name" : "Wojna Domowa", "year" : 1976 }
wyszukiwanie tekstu w kolekcji
> db.movie.find({year:2005})
{ "_id" : ObjectId("5a08c3920196d2a804e6515f"), "name" : "Wild Hogs", "year" : 2005 }
> db.actor.save({name:"Cezary pazura"})
WriteResult({ "nInserted" : 1 })
> show collections
actor movie
> show tables
actor movie
> db.getCollectionNames()
[ "actor", "comedy" ]
UPDATE DANYCH W KOLEKCJI
> db.movie.find()
{ "_id" : ObjectId("5a08c3980196d2a804e65160"), "name" : "Kingsajz", "year" : 1997 } { "_id" : ObjectId("5a08c39e0196d2a804e65161"), "name" : "Faceci w czerni", "year" : 2009 } { "_id" : ObjectId("5a08c4b30196d2a804e65162"), "name" : "Wild Hogs", "year" : 2005 } { "_id" : ObjectId("5a08c5450196d2a804e65163"), "name" : "Wojna Domowa", "year" : 1976 }
Zmienimy rok produkcji z 2005 na 2010 dla wszystkich wierszy w kolekcji
> db.movie.update({"name" : "Wild Hogs", "year" : 2005}, {"name" : "Wild Hogs", "year" : 2010})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.movie.find()
{ "_id" : ObjectId("5a08c3980196d2a804e65160"), "name" : "Kingsajz", "year" : 1997 } { "_id" : ObjectId("5a08c39e0196d2a804e65161"), "name" : "Faceci w czerni", "year" : 2009 } { "_id" : ObjectId("5a08c4b30196d2a804e65162"), "name" : "Wild Hogs", "year" : 2010 } { "_id" : ObjectId("5a08c5450196d2a804e65163"), "name" : "Wojna Domowa", "year" : 1976 }
Liczba wierszy w tabeli
> db.movie.count({})
4
USUWANIE DANYCH W KOLEKCJI
Usuwanie jednego wiersza spełniającego warunek (=”Wojna Domowa”)
> db.movie.remove({name:"Wojna Domowa"})
WriteResult({ "nRemoved" : 1 })
> db.movie.find()
{ "_id" : ObjectId("5a08c3980196d2a804e65160"), "name" : "Kingsajz", "year" : 1997 } { "_id" : ObjectId("5a08c39e0196d2a804e65161"), "name" : "Faceci w czerni", "year" : 2009 } { "_id" : ObjectId("5a08c4b30196d2a804e65162"), "name" : "Wild Hogs", "year" : 2010 }
> db.movie.update({name:'Kingsajz'}, {$unset:{cast:1}})
> db.movie.remove()
db.comedy.drop()
> show collections
Nic nie pokazuje bo kolekcje zostały usunięte.
> use movies
> db.dropDatabase()
{ "dropped" : "mydb", "ok" : 1 }
UŻYTKOWNICY W BAZIE MONGO
use mydb
db.createUser({user: "TestUser", pwd: "12345678",
roles: [{ role: "readWrite", db: "mydb" }]
})
Successfully added user: { "user" : "TestUser", "roles" : [ { "role" : "readWrite", "db" : "mydb" } ] }
Listę userów wyświetlimy poleceniem. Lista ta jest zapisana w kolekcji system.users
w bazie admin
> show users
db.getUsers()
{ "_id" : "mydb.TestUser", "user" : "TestUser", "db" : "mydb", "roles" : [ { "role" : "readWrite", "db" : "mydb" } ] }
Usuwanie użytkownika
> db.users.remove( {"username": "TestUser"})
WriteResult({ "nRemoved" : 0 })