sql >> Databáze >  >> NoSQL >> MongoDB

Mongoid store_in vytváří náhodné výsledky

Chvíli mi to trvalo, ale našel jsem odpověď. Rozhodl jsem se to zveřejnit v naději, že to pomůže ostatním.

Mongoid implementuje něco, čemu se říká „dědičnost jedné tabulky“. Jakmile odvodíte podřízenou třídu z nadřazené třídy, podřízená třída bude uložena v nadřazené kolekci přidáním atributu „type“. Použití "store_in" řekne mongodb explicitně, do které kolekce má ukládat dokumenty. Definování store_in v podřízené třídě způsobí, že mongoid uloží vše (včetně rodiče) v dané kolekci. Myslím, že použití vyhrazených přiřazení store_in pro každé dítě zkazí mongoidy. Výsledkem však je, že se dokumenty ukládají náhodně do kterékoli z daných sbírek.

To lze vyřešit v Ruby pomocí modulu jako mixinu pro běžnou funkčnost. To je docela dobře popsáno v tento dokument .

ALE rozhodl jsem se to přece neudělat! Důvodem, proč jsem to chtěl, je udržet mé sbírky malé a doufat v lepší výkon. Po rozhovoru s některými (10gen) odborníky si myslím, že lepším přístupem je použití jediné rodičovské kolekce objektů pro všechny podřízené prvky. Nemělo by to mít žádný dopad na výkon mongodb, ale řešení se stává mnohem flexibilnější. Ve skutečnosti to mnohem lépe využívá bezschemaless design v mongodb.

Takže kód bude vypadat znovu takto:

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

class ChildClass1 < BaseClass
  ...individual functionality...
end  

class ChildClass2 < BaseClass
  ...individual functionality...
end



  1. jak bezpečně aktualizovat pořadové číslo v mongodb

  2. Mezipaměť Redis vs přímé použití paměti

  3. Mongoose:Použití addToSet s ObjectId vede k osiřelému ID

  4. Jak vytvořit vlastní dotaz na řazení v jarním bootu pro mongo db repozitář?