2014-01-09 3 views
1

У меня есть следующие модели мангуста в моих экспрессе-приложениях:mongoose - возможная круговая зависимость?

//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) {../}); 

Вы можете хранить 2 схемы в отдельных файлах .js и require них оба

+0

Это очень полезно. Что, если вы хотите, чтобы у человека были связи с другими людьми (например, родственники, из-за отсутствия лучшего примера). Не могли бы вы сделать то же самое для ссылки на массив объектов той же модели? Могли бы вы добавить 'родственников: [{type: Schema.Types.ObjectId, ref: 'Person'}]' to personSchema? – ramdog

Смежные вопросы