Mongoose对象最佳实践

3

我有一个user.js文件,其中包含所有我的mongoose模式和方法,大致如下:

var userSchema = mongoose.Schema({
  name: { type: String, required: true, trim: true },
  surname: { type: String, required: true },
});

var User = mongoose.model('User', userSchema);

现在,最好将模拟数据的函数暴露出来吗?像这样:
exports.addUser = function(data, next){
  user = new User(data);
  user.save(next);
};

exports.getAll = function(next){
  var query = User.find();
  query.exec(next);
};

还是只暴露User对象以便在其他地方使用呢?

module.exports = User; //or
exports.User = User;

我也面临着从第二种解决方案派生出的问题,假设我想将一辆汽车列表添加到我的userSchema中,而汽车模式是在另一个文件car.js中定义的,那么这意味着我将不得不将carSchema暴露给我的user.js文件,是吗?这意味着我实际上正在否定我提供的第二个解决方案,那么,正确的方法是如何做这种事情呢?


我不会将单个类的模式定义分散到多个文件中。 - WiredPrairie
1个回答

5

有趣的问题。

这可能只是一种“语法糖”的东西,但我仍然坚持第二种变体,因为我认为没有必要将生成等内容封装起来。 mongoose是这些内容的包装器,人们可以使用纯mongoose模型和模式。这对您听起来合理吗?

exports.User = User;

3
非常赞同。如果需要实现与模型相关的自定义函数,Mongoose 还提供了接口来实现静态方法实例方法 - robertklep
这是有道理的,但如果像问题中所述,User还包含另一个模式怎么办?想象一下一个userSchema,它也有像这样的汽车:cars: [carSchema]。那么我是否还需要在car.js中添加类似于exports.carSchema = mongoose.Schema({whatever})的内容? - user3060636
我希望我理解得没错。请看一下这个Gist:https://gist.github.com/johannesboyne/8347861,正如你所看到的,我使用了这个mongoose方法`orgas: [{type: mongoose.Schema.ObjectId, ref: 'Organization'}]`来链接它们,但是当然必须导出两个模式。这感觉很正确,因为对于每个模式,在我们的MongoDB中创建一个新的文档集合,不是吗? - johannesboyne
看一下这个问题,我在这里详细解释了。http://stackoverflow.com/questions/21023089/mongoose-possible-circular-dependency - user3060636

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接