sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoid store_in ger slumpmässiga resultat

Det tog ett tag men jag kom på svaret. Jag bestämde mig för att lägga upp det i hopp om att det skulle hjälpa andra.

Mongoid implementerar något som kallas "single table inheritance". Så snart du härleder en underordnad klass från en överordnad klass, kommer barnet att lagras i föräldrasamlingen och lägga till ett "type"-attribut. Att använda "store_in" talar om för mongodb vilken samling dokument ska lagras i. Att definiera store_in i den underordnade klassen gör att mongoid lagrar allt (inkl. föräldern) i den givna samlingen. Jag antar att användning av en dedikerad store_in-uppdrag för varje barn förstör mongoid. Men resultatet är att dokument lagras slumpmässigt i någon av de givna samlingarna.

Detta kan lösas i Ruby med en modul som mixin för den gemensamma funktionaliteten. Detta beskrivs ganska bra i det här dokumentet .

MEN jag bestämde mig för att inte göra det här trots allt! Anledningen till att jag ville ha det här är för att hålla mina samlingar små, i hopp om att få bättre prestanda. Efter att ha pratat med några (10gen) experter tror jag att det bättre tillvägagångssättet är att använda ensamstående objektsamling för alla underordnade element. Det bör inte påverka prestandan för mongodb men lösningen blir mycket mer flexibel. Detta gör faktiskt mycket bättre användning av den schemalösa designen i mongodb.

Så koden kommer att se ut så här igen:

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

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

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



  1. SCAN vs KEYS prestanda i Redis

  2. Duplicera ett dokument i MongoDB med ett nytt _id

  3. MongoDB-grupp efter Functionalities

  4. nodejs mongodb objekt-id till sträng