适用于类似于应用程序,嵌入式文档或单独集合的MongoDB模式设计?

问题描述:

我有一个应用程序需要在以下方式工作:
- 当应用程序用户设置过滤器和应用程序返回一组引号。
- 然后用户可以喜欢或不喜欢那个“报价”

我们有大约60K的报价和大约相同的用户数量。 我很困惑使用嵌入式数组来存储喜欢&不喜欢引号的ID或创建一个单独的集合,然后做一个查找。 我知道2and选项将需要两个查询,并且会变得更慢。适用于类似于应用程序,嵌入式文档或单独集合的MongoDB模式设计?

如果我使用嵌入式数组方法,在开始目击性能击中之前可以存储多少个报价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帕特尔的提示。

基础上的研究,我做了MongoDB的和可能的解决这个问题,我设计,我创造了约10K随机数,这在现实世界中会come from another collection$nin运营商 传递到一个猫鼬发现查询阵列测试尽管我预计查询在较高负载下会变慢,但在我的测试中,它非常快!
关于195 requests per second4 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()。 这种方法也将提供更好的性能,因为您只需激发一个查询。我假设,当你显示用户的信息时,你也会显示他/她喜欢和不喜欢的引用。在这种情况下,这将是一个更好的方法。

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

+0

我看了一下,因为许多开发人员,我来自RDBMS背景,通过mongodb文档,它提到了聚合框架支持计算结果的阶段,所以对于我的情况,是否可以使用另一个集合中的查找聚合呢? – Harshwardhan

+0

@Harshwardhan是的,如果你正在使用猫鼬,你可以使用人口。 [链接](http://mongoosejs.com/docs/populate.html)。 –