【问题标题】:Can a Mongo model self referenceMongo模型可以自我参考吗
【发布时间】:2014-09-17 20:24:29
【问题描述】:

我有一个这样的模型:

var userSchema = new mongoose.Schema({
  _id: { type: Schema.ObjectId },
  email: { type: String, unique: true },
  ipAddress: { type: String },
  referals: [{
    type: mongoose.Schema.Types.ObjectId, ref: 'User'
  }],
  redeem_token: {type: String, unique: true}
});

var User = mongoose.model('User', userSchema);

这行得通吗?用户,需要对其他用户有参考。这是为了跟踪注册推荐。然后我想使用.Populate 并扩展referals[] 中的用户

【问题讨论】:

  • 当然,应该可以。你试过了吗?
  • 是的,它完全按照它应该的方式工作!我只是在课堂上思考它,没有地方测试它;老实说,这里的问题可能是不必要的,我只是不想在没有答案的情况下失去想法!感谢您的回复。

标签: mongoose


【解决方案1】:

我正在使用猫鼬。这对我有用,我只是使用this 作为模型的参考。 我有一个Comment 模型。评论可以有回复也是Comment

var Comment = new mongoose.Schema({
  id: { type: ObjectId, required: true },
  comment:    { type: String },
  replies:    [ this ],
});    

【讨论】:

  • 好的。这行得通,但怎么可能呢?我认为this 将在调用Schema 构造函数时引用任何上下文。我很困惑。
  • 你能说出要获得评论的所有回复的查询是什么吗?
  • @kub1x 可能猫鼬在某处使用 .bind(thisSchema) :javascripttutorial.net/javascript-bind
  • @AlbertJamesTeddy 这仅适用于绑定函数代码中的this。我们不在其中。
  • @kub1x 你可能是对的,我一直在查看源代码,我找不到任何与使用this 表示自我引用相关的内容。我想知道this 是否只是被视为混合类型。
【解决方案2】:

我知道这个问题很老了。但我在寻找类似问题的解决方案时偶然发现了这一点。所以,这是为未来的知识寻求者准备的!

如果您希望在用户文档中创建引用,Ankur 的回答会有所帮助。 例如:

{
  _id: 'XXX',
  ...
  referals: [{_id:'yyy',email: ''}]
}

我认为使用Mongoose Virtuals 将有助于更好地扩展应用程序。使用虚拟数据,您不必创建重复记录。

因此,如果您决定使用 Mongoose Virtuals,您的架构将如下所示

var userSchema = new mongoose.Schema({
  _id: { type: Schema.ObjectId },
  email: { type: String, unique: true },
  ipAddress: { type: String },
  referedBy: {
    type: mongoose.Schema.Types.ObjectId, ref: 'User'
  },
  redeem_token: {type: String, unique: true}
});

userSchema.virtuals('refereals',{
   ref: 'User',
   localField: '_id',
   foreignField: 'referedBy',

   justOne: false,
},{ toJSON: { virtuals: true } }); /* toJSON option is set because virtual fields are not included in toJSON output by default. So, if you don't set this option, and call User.find().populate('refereals'), you won't get anything in refereals */

var User = mongoose.model('User', userSchema);

希望这会有所帮助。如果我错了,请纠正我,因为我是新手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2017-04-10
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多