Skip to content

mongodb

ghdrako edited this page Feb 25, 2024 · 27 revisions

Instalacja

mdir \data\db
mongod.exe --dbpath d:\test\mongodb\data

Connect client

mongosh

Kolekcje

Insert

Dodanie do kolekcji me dokument address : {street : "Marszałkowska", city : "Warszawa"}:

db.me.insertOne(
{
	name : "Rafał",
	age : 35,
	address : {street : "Chłodna", city : "Warszawa"}
})

Delete

db.users.deleteOne({_id : 1})
db.users.deleteMany({name : "Ann"})
db.Users.deleteMany({})
db.Users.drop()

Count

db.Users.countDocuments()

Find

  • pobieranie "wszystkie" dokumenty - stremming danych - założony zostanie kursor i domyślnie dostaniemy 20 dokumentów iterująca sterownik będzie wysylal getMore(). Kazdy sterownik zapewnia mechanizm streemingu danych. Kursor nie jest izolowany - jesli dojda dokumenty to pojawiasie w kursorze. Klient mongodb opiera sie na sterowniku node.js. Find domyslnie streemuje dane za pomoca kursora. Jesli nieaktywnosc to kursor jest zamykany domyslnie po 10 minutach
db.me.find({})   # SELECT * FROM me;

Where

{ <field1>: <value1>, ... }

db.me.find({"age" : 30})  # select * from me where age = 30;

projekcja

db.<colection>.find(<where>,<projection>)
db.me.find({},{name : 1})  # domyślnie dorzuca tez id  select _id,name from me
db.me.find({},{name : 1, _id : 0}) # wymuszamy by nie zwrócił id select name from me
db.me.find({}, {name : 0})    # wszystkie pola oprocz name
db.me.find({"name" : "Artur"}).sort("age")  # sortowanie select * from me order by age;
db.me.find({"name" : "Artur"}).skip(10) 
db.me.find({"name" : "Artur"}).limit(10) # select * from me limit 10

Filtrowania - selektory zapytań $ne $gt $gte $lt $in $nin


Regex

Warunki logiczne $and $or $exist

db.me.find({"filed" : {$exist : 1}})
db.me.find({"filed" : {$exist : 0}})

findOne - zwraca pojedynczy losowy dokument spełniający filtr nie tworząc kursora

elemMatch

db.products.find({},($elemMatch : {"warehouses : {qty : {$lt : 10}}}})

$unset

Zmiana nazwy pola

db.me.updateMany({},{$unset : { "name" : "imie"}}) # zmiana nazwy - obsługa polskich znaków
db.me.updateMany({},{$unset : { "age" : ""}}) # usuniecie pola

Agregacje - Agregation Pipeline

  • wzorowana na operatorze | w linux - pipeline
  • definiujemy pipeline przez który przejdą nasze dane (kolekcja)
kolekcja ---> filtr ---> projekcja ---> grupowania ---> filtrowania ---> out ---> kolekcja 2

Każdy z etapów może występować dowolna ilość razy - tutaj np. 2 razy filtrowanie

db.

.agregate i dalej kroki
  • operator $match - taki sam jak find
{ $match : {query}}


db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}]
    )

to samo co

db.movies.find({directed_by: "George Lucas"})
  • operator $sort
db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}}  // sortowanie malejaco -1
    ]
    )
  • operator $limit

  • Operator $project

db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}},
      {$project : {title : 1}}
    ]
    )
  • Tworzenie nowego pola zysk jako roznica
db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}}, 
      {$project : {zysk : {$subtract : ["$revenue.Amount" , "$budget.Amount"]}}}
 
    ]
    )
  • operator $addFields - dodanie pola do dokumentu

  • $arrayElemAt ; {, index] - zwraca wybrany element tablicy

Pobranie MongoDb Tools

mongoimport --db test --collection movies --jsonArray --drop movies.json
./mongoimport --db test --collection movies --jsonArray --drop movies.json
  • --jsonArray - to nie sa pojedyncze jsony tylko tablica jsonow
  • --drop - kolekcja przed zaimportowaniem bedzie dropowana

Inne mongostat - statystyki

Narzedzia do przegladania

  • noSqlBooster - darmowe z ograniczeniami - najprostrzy w instalacji
  • Robo3T -- nie rozwijany opensource darmowy (wykupilo Studio3T i zamknelo)
  • Studio3T - darmowe z ograniczeniami
  • Compass - darmowy ale ubogi
  • Vs Code + plugin MongoDB

Test

Clone this wiki locally