MongoDB tinder 的模式设计,如应用程序、嵌入式文档或单独的集合?
MongoDB schema design for tinder like application , Embedded document or a separate collection?
我有一个应用程序需要按以下方式工作:
- 当应用程序用户设置过滤器并且应用程序 returns 一组引号。
- 然后用户可以喜欢或不喜欢 "quote"
我们有大约 6 万条报价和大约相同数量的用户。
我对使用嵌入式数组存储喜欢和不喜欢的引号 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
并将其传递给带有 $nin
运算符的猫鼬查找查询
虽然我预计查询在较高负载下会很慢,但在我的测试中它非常快!
关于 195 requests per second
4 GB 双核盒子 运行 Ubuntu 16
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
});
根据来自 mongodb.com
的这篇信息丰富的文章
6 rules of thumb for MongoDB schema
如果您知道喜欢或不喜欢的报价数量不会增长超过几千。您可以在 UserSchema 中有一个引用 id 数组并使用 populate()。
这种方法还将提供更好的性能,因为您只需触发一个查询。我假设当您显示用户信息时,您还会显示 his/her 喜欢和不喜欢的引述。在那种情况下,这将是一个更好的方法。
如果您知道它会很大,您也可以有一个包含所有 ID 的单独集合。在这种情况下,您必须触发一个额外的查询。
我有一个应用程序需要按以下方式工作:
- 当应用程序用户设置过滤器并且应用程序 returns 一组引号。
- 然后用户可以喜欢或不喜欢 "quote"
我们有大约 6 万条报价和大约相同数量的用户。
我对使用嵌入式数组存储喜欢和不喜欢的引号 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
并将其传递给带有 $nin
运算符的猫鼬查找查询
虽然我预计查询在较高负载下会很慢,但在我的测试中它非常快!
关于 195 requests per second
4 GB 双核盒子 运行 Ubuntu 16
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
});
根据来自 mongodb.com
的这篇信息丰富的文章6 rules of thumb for MongoDB schema
如果您知道喜欢或不喜欢的报价数量不会增长超过几千。您可以在 UserSchema 中有一个引用 id 数组并使用 populate()。 这种方法还将提供更好的性能,因为您只需触发一个查询。我假设当您显示用户信息时,您还会显示 his/her 喜欢和不喜欢的引述。在那种情况下,这将是一个更好的方法。
如果您知道它会很大,您也可以有一个包含所有 ID 的单独集合。在这种情况下,您必须触发一个额外的查询。