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

Mongoose:Jak zapełnić populację o głębokości 2 poziomu bez wypełniania pól pierwszego poziomu? w mongodb

Jako zagorzały fan mongodb sugeruję, abyś używał relacyjnej bazy danych dla wysoce relacyjnych danych - do tego jest zbudowana. Tracisz wszystkie zalety mongodb, gdy musisz wykonać 3+ zapytania, aby uzyskać pojedynczy obiekt.

Buuuuuu , wiem, że komentarz trafi do głuchych uszu. Najlepiej jest być tak świadomym, jak to tylko możliwe, jeśli chodzi o wydajność. Pierwszym krokiem jest ograniczenie pól do wymaganego minimum. Jest to po prostu dobra praktyka nawet w przypadku podstawowych zapytań i dowolnych silnik bazy danych - uzyskaj tylko potrzebne pola (np. SELECT * FROM ===źle... po prostu przestań to robić!). Możesz także spróbować wykonać szczupłe zapytania, aby zaoszczędzić wiele pracy związanej z przetwarzaniem danych, które mangusta wykonuje z danymi. Nie testowałem tego, ale powinno działać...

SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
    name: 'fieldB',
    select: 'fieldC',
    options: { lean: true }
}).exec(function (err, result) {
    // not sure how you are populating "result" in your example, as it should be an array, 
    // but you said your code works... so I'll let you figure out what goes here.
});

Ponadto bardzo "mongo" sposobem na zrobienie tego, co chcesz, jest zapisanie odniesienia w SchemaC z powrotem do SchemaA. Kiedy mówię „mongo” sposób na zrobienie tego, musisz oderwać się od lat myślenia o relacyjnych zapytaniach danych. Zrób wszystko, aby wykonać mniej zapytań w bazie danych, nawet jeśli wymaga to dwukierunkowych odwołań i/lub duplikacji danych.

Na przykład, gdybym miał schemat Książka i Autor, prawdopodobnie zapisałbym imię i nazwisko autora w kolekcji Książki wraz z referencją _id do pełnego profilu w kolekcji Authors. W ten sposób mogę załadować moje książki w jednym zapytaniu, nadal wyświetlać nazwisko autora, a następnie wygenerować hiperłącze do profilu autora:/author/{_id} . Jest to znane jako „denormalizacja danych” i wiadomo, że powoduje zgagę. Staram się używać go na danych, które nie zmieniają się zbyt często - jak nazwiska ludzi. W przypadku, gdy nazwa się zmieni, napisanie funkcji aktualizującej wszystkie nazwy w wielu miejscach jest trywialne.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zagnieżdżone grupowanie z MongoDB

  2. @DBRef nie pobiera danych podczas korzystania z Spring Data Mongo

  3. MongoDB:Używanie $sample ze sterownikiem C#

  4. node res.render zmienia widok, ale nie url

  5. mongodb:aktualizowanie elementów?