猫鼬 - 可能的循环依赖?

use*_*636 1 mongoose mongodb node.js

我的 Express 应用程序中有以下猫鼬模型:

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

var dogSchema = (exports.dogSchema = mongoose.Schema({
  name: { type: String, required: true },
}));
Run Code Online (Sandbox Code Playgroud)

然后我导入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],
});
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*nce 6

您可以在两个方向上同时创建参考,而不会产生循环问题。使用 . 创建从一个文档到另一文档的引用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);
Run Code Online (Sandbox Code Playgroud)

然后您可以选择使用加载子文档populate

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

然后,您可以将这两个模式存储在单独的 .js 文件中,并且require它们都

  • 这非常有帮助。如果您希望一个人与其他人(比如亲戚,因为缺乏更好的例子)有联系怎么办?您可以对同一模型的对象数组的引用执行相同的操作吗?那么你可以将 `relatives : [{ type: Schema.Types.ObjectId, ref: 'Person' }]` 添加到 personSchema 中吗? (2认同)