猫鼬 - 可能的循环依赖?

Posted

技术标签:

【中文标题】猫鼬 - 可能的循环依赖?【英文标题】:mongoose - possible circular dependency? 【发布时间】:2014-01-28 04:09:22 【问题描述】:

我的快递应用中有以下猫鼬模型:

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

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

然后我将dog.js 导入到我的user.js

//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],
);

现在,从我的路线中,我正在创建一个这样的新用户:

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);

这是进行此类操作的正确方法吗?我有一种感觉,我可能会以某种方式生成循环依赖,而且无论如何它对我来说看起来不正确。关于如何创建来自另一个模型文件的架构的子文档的任何想法?

【问题讨论】:

【参考方案1】:

您可以在两个方向上同时创建参考,而不会产生循环问题。使用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 将它们都存储起来

【讨论】:

这很有帮助。如果您希望某人与其他人有联系(比如亲戚,因为没有更好的例子)怎么办。你可以对相同模型的对象数组的引用做同样的事情吗?那么你能把relatives : [ type: Schema.Types.ObjectId, ref: 'Person' ] 添加到personSchema 吗?

以上是关于猫鼬 - 可能的循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 应用程序可能存在循环依赖问题

Spring中-IOC-Bean的初始化-循环依赖的解决

彻底理解Spring如何解决循环依赖

架构案例-依赖倒置循环依赖解耦

架构案例-依赖倒置循环依赖解耦

架构案例-依赖倒置循环依赖解耦