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

Jak wysłać zapytanie do elementu względnego za pomocą MongoDB

Wszystko w tym jest dość okropne, nie można indeksować czegoś takiego jak wartości „imię”, a twoja „ścieżka” do każdego atrybutu będzie się zmieniać wszędzie. Więc to jest naprawdę złe w przypadku zapytań.

Zauważyłem, że wspominasz o „zagnieżdżonych” strukturach i nadal możesz to uwzględnić za pomocą podobnej propozycji i dodatkowego tagowania, ale chcę, abyś rozważył ten przykład typu „książka telefoniczna”:

{
    "phones": [
        {
           "type": "Home",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
        {
           "type": "Work",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
    ]
}

Ponieważ w rzeczywistości są to dokumenty podrzędne w tablicy, pola takie jak „nazwa” zawsze mają tę samą ścieżkę, więc nie tylko można je indeksować (co będzie dobre dla wydajności), ale zapytanie jest bardzo proste:

db.collection({ "phones.name": "Jeff" })

To robi dokładnie to, czego potrzebujesz, znajdując „Jeff” w dowolnym wpisie „imię”. Jeśli potrzebujesz hierarchii, dodaj kilka pól w tych dokumentach podrzędnych, aby wskazać relację nadrzędny/podrzędny, której możesz użyć podczas przetwarzania końcowego. Lub nawet jako zmaterializowana ścieżka, która może wspomóc Twoje zapytania.

To naprawdę lepsze podejście.

Jeśli naprawdę musisz zachować tego rodzaju strukturę, zrób przynajmniej coś takiego z JavaScriptem, który wyskoczy przy pierwszym dopasowaniu na głębokość:

db.collection.find(
  function () {
    var found = false;

    var finder = function( obj, field, value ) {
      if ( obj.hasOwnProperty(field) && obj[field] == value )
        found = true;

      if (found) return true;

      for( var n in obj ) {
        if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
          finder( obj[n], field, value );
          if (found) return true;
        }
      }

    };

    finder( this, "name", "Jeff" );
    return found;

  }
)

Format jest notacją skróconą dla $where operatora, co jest dość złą wiadomością dla wydajności, ale twoja struktura nie oferuje zbyt wiele innego wyboru. W każdym razie funkcja powinna powtarzać się w każdym zagnieżdżonym dokumencie, dopóki nie zostanie znalezione „pole” z „wartością”.

W przypadku wszystkiego, co ma skalę produkcyjną, naprawdę spójrz na zmianę struktury na coś, co można szybko zindeksować i uzyskać do niego dostęp. Pierwszy przykład powinien dać ci punkt wyjścia. Poleganie na dowolnym JavaScript w zapytaniach, ponieważ ogranicza Cię obecna struktura, to zła wiadomość.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:problem DNS z resolv.conf łączącym się z MongoDB

  2. Nie można utworzyć indeksu w mongodb, klucz jest za duży do indeksowania

  3. Modelowanie wiele do wielu :za pomocą Mongoid/MongoDB

  4. Znajdź zduplikowane adresy URL w mongodb

  5. Z mat-wybierz zapisz dane do bazy danych MongoDB