模式内的Mongoose模式
我怎样才能添加架构到另一个架构? 这似乎不是有效的:
var UserSchema = new Schema({ name : String, app_key : String, app_secret : String }) var TaskSchema = new Schema({ name : String, lastPerformed : Date, folder : String, user : UserSchema })
我检查了网站,它显示了如何声明它为一个数组,但不是单身。
谢谢
有几种方法可以做到这一点。 最简单的就是这样:
var TaskSchema = new Schema({ name : String, lastPerformed : Date, folder : String, user : Schema.ObjectId });
然后,您只需确保您的应用程序正在编写该ID,并在查询中使用该ID来根据需要提取“相关”数据。
当通过用户IDsearch任务时,这是很好的,但通过任务ID查询用户时更麻烦:
// Get tasks with user id Task.find({user: user_id}, function(err, tasks) {...}); // Get user from task id Task.findById(id, function(err, task) { User.findById(task.user, function(err, user) { // do stuff with user } }
另一种方法是利用Mongoose的填充function来简化查询。 为了得到这个,你可以做到以下几点:
var UserSchema = new Schema({ name : String, app_key : String, app_secret : String, tasks : [{type: Schema.ObjectId, ref: 'Task'}] // assuming you name your model Task }); var TaskSchema = new Schema({ name : String, lastPerformed : Date, folder : String, user : {type: Schema.ObjectId, ref: 'User'} // assuming you name your model User });
有了这个,你对所有用户的查询,包括他们的任务数组可能是:
User.find({}).populate('tasks').run(function(err, users) { // do something });
当然,这意味着要在两个地方保持ID。 如果困扰你,最好坚持第一种方法,习惯于编写更复杂(但仍然很简单)的查询。
这个简单的解决scheme呢?
var TaskSchema = new Schema({ name : String, lastPerformed : Date, folder : String, user : { name : String, app_key : String, app_secret : String } })