我有一个应用程序需要以下列方式工作:
- 当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
});
答案 0 :(得分:2)
根据mongodb.com的这篇资料性文章
6 rules of thumb for MongoDB schema
如果你知道喜欢或不喜欢的报价数量不会增加超过几万。您可以在UserSchema中使用一组引号ID并使用populate()。 此方法还将提供更好的性能,因为您只需触发一个查询。我假设当您显示用户的信息时,您还会显示他/她喜欢和不喜欢的报价。在这种情况下,这将是一种更好的方法。
如果你知道它将是一个很大的数量,你可以有一个单独的集合与所有的ID。在这种情况下,您必须触发一个额外的查询。