2014-01-09 50 views
1

我有以下的猫鼬模型在我的快递应用:现在猫鼬 - 可能的循环依赖?

//user.js 
var mongoose = require('mongoose'); 
var dog  = require('./dog'); 

var userSchema = mongoose.Schema({ 
    user: { type: String, required: true }, 
    pass: { type: String, required: true }, 
    dogs: [dog.dogSchema], 
}); 

//dog.js 
var mongoose = require('mongoose'); 

var dogSchema = exports.dogSchema = mongoose.Schema({ 
    name: { type: String, required: true }, 
}); 

,从我的路线,我创造这样一个新用户:

var user = require('../models/user'); 
    var dog = require('../models/dog'); 

    dog = new dog.Dog(dogData); 
    user = new user.User(data); //this will of course contain also dogData 
    user.save(next); 

这是做这种正确的方法的操作?我感觉我可能会以某种方式产生循环依赖,反正它对我来说看起来不正确。关于如何在架构来自其他模型文件的情况下创建子文档的任何想法?

回答

3

您可以在两个方向上创建同时引用而不会产生循环问题。使用ref创建从一个文档到另一个文档的引用。从文档:

http://mongoosejs.com/docs/populate.html

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 

var personSchema = Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] 
}); 

var storySchema = Schema({ 
    _creator : { type: Number, ref: 'Person' }, 
    title : String, 
    fans  : [{ type: Number, ref: 'Person' }] 
}); 

var Story = mongoose.model('Story', storySchema); 
var Person = mongoose.model('Person', personSchema); 

然后你就可以选择加载使用populate

Story.find({ --your criteria-- }) 
    .populate('_creator') 
    .exec(function (err, story) {../}); 

然后,您可以存储在单独的.js文件和require他们2架构的子文件均为

+0

这非常有帮助。如果你想让人与其他人有联系(说亲人,缺乏一个更好的例子)会怎么样?你可以做同样的模型对象的数组引用吗?所以你可以添加'亲属:[{type:Schema.Types.ObjectId,ref:'Person'}]'到personSchema? – ramdog