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

Zapytanie o dokumenty, które posiadają wewnętrzne podpole o danej wartości

W MongoDB zawsze było to możliwe, ponieważ zawsze istniała możliwość tworzenia warunków zapytania przy użyciu Ocena JavaScript :

db.attrs.find(function() {
    var attrs = this.attrs;
    return Object.keys(attrs).some(function(key) {
       return attrs[key].value === "14"
    });
})

Gdzie to poprawnie zwróci dokumenty, które pasują do warunku tutaj, przeszukując możliwe klucze w dokumencie pod kątem wymaganej wartości.

Ale tak naprawdę nie jest to pytanie „możliwe”, ale bardziej jedno z „czy to naprawdę dobry pomysł” , dla którego podstawowa odpowiedź brzmi „Nie”.

Bazy danych to niestałe bestie, które lubią optymalizować za pomocą takich rzeczy, jak indeksy i tym podobne, a także ich własny oczekiwany zestaw operatorów, aby wyszukiwanie było jak najbardziej wydajne. Więc tak, możesz przejść przez interpreter języka, który skutecznie ocenia zakodowany stan w każdym dokumencie, lub możesz ponownie rozważyć swój wzorzec projektowy.

Bazy danych uwielbiają „porządek”, więc daj mu trochę, ponieważ istnieje prosta zorganizowana restrukturyzacja danych, które proponujesz:

{
    "attrs" : [
        { "key": "A1", "type" : "T1", "value" : "13" },
        { "key": "A2", "type" : "T2", "value" : "14" }
     ]
}

Zorganizowane w ten sposób zapytanie staje się tak proste, jak:

db.attrs.find({ "attrs.value": "14" })

I oczywiście może obsługiwać i używać indeksu w dowolnej z tych właściwości poddokumentu w tablicy.

MongoDB jest w końcu "bazą danych" i jak wszystkie bazy danych, jest bardziej zainteresowany "wartościami" swoich właściwości, a nie wyszukiwaniem przy użyciu nazw swoich "kluczy". Tak więc rzeczy, które reprezentują znaczące „dane” nie powinny być częścią nazwy „klucza”, ale raczej powinny być „wartością” „klucza” jako „identyfikatora”, jak pokazano powyżej.

Spójna ścieżka do danych, o które chcesz zapytać, to optymalny sposób pracy z danymi w MongoDB. Korzystanie ze struktury, w której nazwy kluczy stale się zmieniają, nie można przez nie przejść poza uruchomieniem kodu, a to jest znacznie wolniejsze i gorsze pod względem wydajności niż korzystanie z natywnych operacji i udogodnień, takich jak indeksy.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Usuwanie dokumentów z kolekcji mongodb z node.js

  2. Jak przetestować metodę, która łączy się z mongo, bez faktycznego łączenia się z mongo?

  3. Zaimplementuj autouzupełnianie w MongoDB

  4. Nie można połączyć się z obrazem dokowanym mongo za pomocą mongoose

  5. Jak przekonwertować ciąg na objectId w LocalField dla $lookup Mongodb