MongoDB架构设计适用于像应用程序,嵌入式文档或单独的集合?

时间:2017-03-27 13:38:49

标签: mongodb performance database-design mongodb-query mongoose-schema

我有一个应用程序需要以下列方式工作:
  - 当App User设置过滤器并且应用程序返回一组引号时。
  - 然后用户可以喜欢或不喜欢"引用"

我们有大约60K的报价和大约相同数量的用户。 我很困惑使用嵌入式阵列存储喜欢和&不喜欢引号的id或创建一个单独的集合然后进行查找。 我知道2and选项需要两个查询,速度会慢一些。

如果我使用嵌入式数组方法,在我开始目睹性能命中之前我可以存储多少引号ID。

var UserSchema = mongoose.Schema({
                 fullName : {type: String,trim: true},
                 gender   : {type: String,enum: ['male', 'female']},
                 age      : {type: Number,required: true},
                 viewed   : []
});`

PS:如果有更好的方法来实现类似功能,请在评论或解决方案中提及

编辑1:
谢谢@niral patel提示。

根据我对mongodb的研究和这个问题的可能解决方案,我设计了一个测试,我创建了一个大约10K个随机数的数组,在现实世界中come from another collection并将其传递给mongoose使用$nin运算符查找查询 虽然我预计查询在更高的负载上会变慢,但在我的测试中它非常快!
关于在Ubuntu 16上运行的 4 GB双核盒上的195 requests per second 在http-proxy后面有两个节点进程运行。

我的最终查询看起来像这样

var userIDs = [];

 // filling userIDs with random numbers
for(var i=0;i<10000;i++){
    userIDs.push(Math.floor(Math.random() * (90000 - 50000)) + 50000);
}

users.find(user_id:{$nin:userIDs}}).limit(10).lean().exec(function(e,d){
    console.log(d); // results
});

1 个答案:

答案 0 :(得分:2)

根据mongodb.com的这篇资料性文章

6 rules of thumb for MongoDB schema

如果你知道喜欢或不喜欢的报价数量不会增加超过几万。您可以在UserSchema中使用一组引号ID并使用populate()。 此方法还将提供更好的性能,因为您只需触发一个查询。我假设当您显示用户的信息时,您还会显示他/她喜欢和不喜欢的报价。在这种情况下,这将是一种更好的方法。

如果你知道它将是一个很大的数量,你可以有一个单独的集合与所有的ID。在这种情况下,您必须触发一个额外的查询。