我正在使用Rails 4.2.1和Mongoid 4.0.0
我有一个User
模型,它嵌入了Following
模型。我想要达到的效果是:
{
username: # This is the id
...
followings: [
{
_id:
username:
datetime:
}
]
}
我不希望followings
包含具有相同用户名的条目。怎么做到这一点?
我尝试了两种方法:
我将validates :username, presence: true, uniqueness: true
放入Following
模型的代码中。但是这个验证是全局性的 - 如果我有John和Sam作为两个用户,而John跟随Sam,那么当Sam想跟随John时,就会出现重复错误。
我在User
模型中添加了一个索引:
index ({ 'followings.username': 1 }, { unique: true, drop_dups: true })
这种方法的问题在于,当我创建用户John时,他的以下字段将具有用户名null
,然后如果我创建用户Sam,则会抛出错误,因为null
用户名重复:
E11000 duplicate key error index: myapp_development.users.$followings.username_1 dup key: { : null }
非常感谢任何帮助
答案 0 :(得分:1)
嗯,事实证明,由于碎片问题,这种建模User
和Following
的方式会导致文档的增长,并且不会最好地利用“富文档”功能,并会影响性能。来自MongoDB doc:
通常,嵌入为读取操作提供了更好的性能, 以及在a中请求和检索相关数据的能力 单一数据库操作。嵌入式数据模型使其成为可能 在单个原子写操作中更新相关数据。
但是,在文档中嵌入相关数据可能会导致情况 文件在创建后增长。使用MMAPv1存储引擎, 文档增长会影响写入性能并导致数据 碎片。
所以我吸取了教训。之前不够充分。所以我将放弃这种建模方式,并将它们分成不同的集合。