Mongoose js:当字段不是列表时,是否应该嵌入文档

mongoose js: should documents be embedded when field is not a list?

本文关键字:是否 文档 列表 js 字段 Mongoose      更新时间:2023-09-26

下面是我的Schema

var UserModel = new Schema({
    id: ObjectId
  , email: String
  , firstName: String
  , lastName: String
  , password: String
});
var MessageModel = new Schema({
    id: ObjectId
  , createdDate: { type: Date, default: Date.now }
  , user: String // should this be [UserModel]?
  , body: String
});

对于我的例子,每条消息都有一个用户,但只有一个。我应该嵌入UserModel还是我应该把用户字段作为一个字符串。未来的一个用例是返回一个查询,该查询包含消息体、创建日期和用户(连接的姓和名)。谢谢。

简短的回答:不,您不应该使用UserModel作为MessgeModel的子文档。

长回答:首先,重新考虑你的命名。这里实际上是在定义模式。稍后,您将把一个模型与这些模式中的每一个关联起来。因此,在这里使用UserSchema和MessageSchema会更合适。

但这不是密切相关的。关于您的问题,您的MessageModel模式不应该包含表示用户的嵌入式文档,除非存在一对一的关系。但是,我希望每个用户将与许多消息相关联(希望如此)。因此,您不希望用户创建的每条消息都有一个新的副本(每个副本都有一个新的_id)。您只需要为每个用户提供一个规范文档,并在MessageModel中对该用户进行引用。

现在,使用字符串引用可能是正确的选择。但是,如果您预期在MessageModel上运行查询,并希望其中的user属性由实际的UserModel文档填充,那么您将需要使用ref.