Pierwsze kroki z MongoDB

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

Ten wpis został opublikowany w kategorii MongoDB i oznaczony tagami . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz