我最好拆分一个精心制作的猫鼬模型吗?

时间:2017-08-13 20:26:11

标签: node.js mongodb mongoose

假设是/login API的情况,其中,对于一组匹配的凭证,应该返回集合中的用户对象,哪种方法会更高效:

1)一个带投影查询的模型:

var UserSchema = new Schema({
  name        : String,
  email       : String,
  dob         : Number,
  phone       : Number,
  gender      : String,
  location    : Object, // GeoJSON format {type: 'Point', geometry: { lat: '23.00', lng: '102.23' }}
  followers   : [UserSchema],
  following   : [UserSchema],
  posts       : [PostSchema],
  groups      : [GroupSchema]
  // ... and so on
});

2)拆分模型:

var UserMinimalSchema = new Schema({
  name        : String,
  email       : String,
  phone       : Number,
  location    : Object, 
});

var UserDetailSchema = new Schema({
  dob         : Number,
  gender      : String,
  followers   : [UserSchema],
  following   : [UserSchema],
  posts       : [PostSchema],
  groups      : [GroupSchema]
  // ... and so on
});

让我们说:

  1. 对于已登录的用户,仅返回idnameemailphonelocation

  2. 第一个模型将使用投影查询返回(1)中的属性。

  3. 在第二种情况下,只有UserMinimalSchema用于查询整个文档。

  4. 基本上两个查询都会返回与(1)中提到的数据量完全相同的数据。

  5. 假设普通用户对象限制为~16MB,并且有1百万条记录。

  6. 如果某人执行了这样的测试/链接到文档,那么分析与否分开将会有多大帮助将是非常有帮助的。

1 个答案:

答案 0 :(得分:2)

我不会使用拆分模型:

  1. 每次要查看所有用户数据时,您都必须执行填充查询
  2. 您正在增加数据存储空间(现在您必须在用户详细信息架构中引用该用户。
  3. 当Mongo进行查找时,它会找到对模型实例的引用,并且只提取您在投影查询中指定的数据。除非在查询中指定,否则它不会将整个对象加载到内存中。