在Mongoose中引用另一个模式

12 浏览
0 Comments

在Mongoose中引用另一个模式

如果我有两个模式,如下所示:\n

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});
var User = mongoose.model('User');
var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

\n我尝试像上面的示例那样将它们连接在一起,但是我无法弄清楚如何做到这一点。最终,如果我能做到这样,它会让我的生活变得非常轻松。\n

var profilePic = Post.postedBy.profilePic

0
0 Comments

问题:如何在Mongoose中引用另一个模式?

在Mongoose中,有时我们需要在一个模式中引用另一个模式。这种情况下,我们可以使用子文档(Subdocuments)的概念来实现。子文档是指一个文档中嵌套另一个文档的情况。

以下是一个示例,演示了如何在一个模式中引用另一个模式:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});
var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

注意到在`postSchema`中,我们使用了`postedBy`字段,并将其类型设置为`userSchema`。这样做会将用户对象嵌入到帖子中,省去了使用引用进行额外查找的步骤。当然,具体使用哪种方式取决于你的应用程序的需求。

总结起来,当我们需要在Mongoose中引用另一个模式时,可以使用子文档的概念来实现。这样可以将一个模式嵌套到另一个模式中,避免了使用引用进行额外查找的步骤。

0
0 Comments

在Mongoose中引用另一个模式是一个常见的需求。然而,在操作过程中可能会遇到一些问题。本文将讨论出现这些问题的原因以及解决方法。

首先,让我们看一下问题的原因。在Mongoose中,我们可以定义多个模式(schemas),每个模式代表一个集合(collection)。有时候,我们需要在一个模式中引用另一个模式的数据。这种引用可以通过将一个模式的字段设置为另一个模式的类型来实现。例如,如果我们有一个模式表示用户(User),另一个模式表示帖子(Post),我们可以在帖子模式中引用用户模式中的数据。

然而,当我们在一个模式中引用另一个模式时,可能会遇到一些问题。一个常见的问题是引用的模式可能尚未定义,或者定义的顺序不正确。这可能导致Mongoose无法正确解析引用。

解决这个问题的方法是使用Mongoose的`ref`属性来指定引用的模式。`ref`属性允许我们明确地告诉Mongoose引用的模式是什么。这样,无论引用的模式在定义时是否可用,Mongoose都能正确解析它。

下面是一个示例,演示了如何在Mongoose中引用另一个模式:

// 定义用户模式
const userSchema = new mongoose.Schema({
  name: String,
});
// 定义帖子模式
const postSchema = new mongoose.Schema({
  title: String,
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User', // 引用用户模式
  },
});
// 创建模型
const User = mongoose.model('User', userSchema);
const Post = mongoose.model('Post', postSchema);

在上面的示例中,我们在帖子模式中引用了用户模式。通过设置`author`字段的类型为`mongoose.Schema.Types.ObjectId`和`ref`属性为`'User'`,我们告诉Mongoose引用的模式是用户模式。

另一个解决这个问题的方法是使用Mongoose的`populate`方法。`populate`方法允许我们在查询结果中填充引用的模式的数据。这样,我们就可以轻松地获取引用模式的完整数据。

下面是一个示例,演示了如何使用`populate`方法填充引用模式的数据:

// 查询帖子并填充作者数据
Post.findOne({ title: 'My First Post' })
  .populate('author')
  .exec((err, post) => {
    if (err) {
      console.error(err);
    } else {
      console.log(post);
    }
  });

在上面的示例中,我们使用`populate`方法填充了帖子模式中的`author`字段。这样,我们就可以在查询结果中获取到作者的完整数据。

当我们在Mongoose中引用另一个模式时,可能会遇到一些问题。这些问题的原因可能是引用的模式尚未定义或定义的顺序不正确。为了解决这些问题,我们可以使用`ref`属性来明确指定引用的模式,并使用`populate`方法来填充引用模式的数据。这样,我们就可以轻松地在Mongoose中引用另一个模式。

0
0 Comments

问题原因:在Mongoose中引用另一个模式时,需要使用populate方法来填充引用字段。然而,对于一些开发者来说,关于ref字段的含义和用法可能不太清楚,因为官方文档中对此并未有明确的说明。

解决方法:在post模式中,更改postedBy字段的定义,添加ref属性来指定该字段引用的模型。然后,在查询时,使用populate方法来填充引用字段。具体实现步骤如下:

首先,对post模式进行更改:

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

然后,创建模型:

var Post = mongoose.model('Post', postSchema);

接下来,在查询时使用populate方法来填充引用字段:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // 处理post对象
});

此外,还有一些其他问题被提及,如populate和addToSet的区别以及by字段的引用选择器。关于"ref"字段的具体说明可以在populate的官方文档中找到:mongoosejs.com/docs/populate.html

0