【问题标题】:Mongoose Embedded Document Pre SaveMongoose 嵌入文档预保存
【发布时间】:2016-05-17 08:34:24
【问题描述】:

我有两个模型,一个是User,另一个是Reservation。我想在每个预订中嵌入一个用户对象。用户已创建并存储在用户集合中。当我尝试创建一个新的 Reservation 对象时,我的 User 对象会通过预保存方法并最终失败,因为存在唯一的用户名字段。将对象嵌入到另一个集合时,有没有办法绕过该预保存方法,或者我的方法完全错误?我的预订模式代码。谢谢!

import User from './../users/users.model';
const Schema = mongoose.Schema;

export default new Schema({
  user: {
    type: User
  }
});

编辑:当我明确定义架构时,它会绕过预保存方法(这是有道理的),但如果我想更改架构,我需要在两个不同的地方进行更改。

【问题讨论】:

  • 唯一约束应该解析为一个 mongo 唯一约束,并且不应该应用于子文档(除非指定,即使那样我也不确定它是如何工作的)。您是否有可能要嵌入 User 模式而不是 User 模型,并且在定义 Reservation 模式时可能不包括唯一约束。
  • 您使用的是哪个版本的猫鼬?尽管它很旧,但您是否检查过这个未解决的问题:github.com/Automattic/mongoose/issues/2645?

标签: node.js mongodb mongoose


【解决方案1】:

您可以按照此流程进行操作。

您应该为 Reservation 文档推荐特定的用户,而不是引用完整的collection。何时保存或创建新的Reservation您应该传递用户id 存储为ObjectId 的信息并将id 引用给用户模型以引用user 模型使用ref 关键字。这样您就可以轻松地从 Reservation 模型中填充 user。

喜欢:

user:{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }

而不是

user: {
    type: User
  }

或者如果你想在reservation schema中嵌入user schema那么可以使用like

user: {
        type: [User]
      }

【讨论】:

  • 我知道我可以引用该对象,但我想嵌入它。不过感谢您提供的信息。
  • 您应该通过传递 id 为特定用户推荐预订文档,而不是参考完整集合
  • 在数组中包含用户无效。它仍在通过验证
猜你喜欢
  • 2017-08-30
  • 2013-12-27
  • 2015-07-03
  • 2011-11-27
  • 2018-06-30
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2015-07-17
相关资源
最近更新 更多