MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Preferowany schemat MongoDB dla kolekcji osadzonych. dokumenty a tablice

W pierwszym podejściu nie możesz indeksować pól id, ponieważ id jest używane jako klucz. Jest to rodzaj działania jak słownik kluczowych wartości. To podejście jest przydatne, jeśli masz znany zestaw identyfikatorów (oczywiście mniejszą liczbę). Załóżmy, że w pierwszym przykładzie identyfikator jest dobrze znany z przodu,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

więc aby znaleźć wartości dla pola identyfikatora idk73716, możesz to zrobić za pomocą

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

puste {} oznacza zapytanie, a druga część {'lines.idk73716':1} to selektor zapytania.

posiadanie identyfikatorów jako kluczy ma tę zaletę, że wybiera tylko konkretne pole. Mimo że {'lines.idk73716':1} jest selektorem pola, tutaj służy jako zapytanie i selektor. ale nie można tego zrobić w twoim drugim podejściu. Załóżmy, że druga kolekcja wygląda podobnie

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

I zindeksowałeś identyfikator pola, więc jeśli chcesz zapytać według identyfikatora

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

widząc powyższe wyniki, widać, że nie ma sposobu, aby wybrać pasujące dokumenty podrzędne (osadzone), ale jest to możliwe w pierwszym podejściu. Jest to domyślne zachowanie mongodb.

patrz

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

pobierze wszystkie linie, nie tylko idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Mam nadzieję, że to pomoże

EDYTUJ

Podziękowania dla @Gates VP za wskazanie

Nadal możemy użyć $exists do zapytania o identyfikator, ale nie będzie on indeksowany



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:BSON do JSON

  2. Agreguj odrębne wartości w MongoDB

  3. Dopasuj wiele kryteriów w tablicy

  4. nie można uruchomić złącza mongo

  5. Nie można uruchomić logstash przy użyciu konfiguracji mongoDB?