2015-07-19 58 views
1

的uniquness验证我用Rails 4.2.1和4.0.0 MongoidMongoid +轨道4 - 实现用户与以下:嵌入模型

我有一个User模型,该模型嵌入Following模型。我想达到的效果是:

{ 
    username: # This is the id 
    ... 
    followings: [ 
     { 
      _id: 
      username: 
      datetime: 
     } 
    ] 
} 

我不想做followings包含使用同一用户名的条目。如何实现这一目标?

我已经尝试了两种方法:

  1. 我把validates :username, presence: true, uniqueness: true代码为Following模型。但是这个验证是全球性的 - 如果我把John和Sam当作两个用户,并且John跟随Sam,那么当Sam想要跟随John时,就会出现重复错误。

  2. 我在User模型增加了一个指标:

    index ({ 'followings.username': 1 }, { unique: true, drop_dups: true }) 这种方法的问题是,当我创建一个用户John,他在以下领域将拥有一个用户名null,然后如果我创建一个用户山姆,抛出一个错误,因为null用户名重复:

    E11000 duplicate key error index: myapp_development.users.$followings.username_1 dup key: { : null }

真的很感谢所有帮助

回答

1

嗯,事实证明,由于碎片问题,建模UserFollowing这种方式会导致文档的规模不断壮大,并且不会使“丰富的文档最好使用'功能,并会损害性能。从MongoDB doc

一般情况下,嵌入提供了读操作, 以及在 单个数据库操作请求和检索相关数据的能力更好的性能。嵌入式数据模型使得在单个原子写操作中更新相关数据成为可能。

但是,在文档中嵌入相关数据可能会导致创建后文档增长的情况 。使用MMAPv1存储引擎时,文件增长可能会影响写入性能并导致数据碎片化。

所以我吸取了教训。之前并不足够。所以我会放弃这种建模方式,将它们分成不同的集合。