在猫鼬中填充子文档

时间:2021-08-01 16:10:37

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

我希望有人能帮助我解决这个问题。我正在尝试填充 subSchema,但我没有运气。 我有一个 replySchemacommentSchema 和一个 UserSchemareplySchemacommentSchema 的子文档,我想用来自 userSchema 的用户详细信息填充它们 我的问题是下面的代码没有填充我的 replySchema:

REPLY-SCHEMA 和 COMMENT-SCHEMA

const replySchema = new mongoose.Schema(
  {
    replyComment: {
      type: String,
      required: [true, 'Reply comment cannot be empty'],
    },
    createdAt: {
      type: Date,
      default: Date.now(),
    },
    user: {
      type: mongoose.Schema.ObjectId,
      ref: 'User',
      required: [true, 'Comment must belong to a user'],
    },
  },
  {
    timestamps: true,
  }
);

const commentSchema = new mongoose.Schema(
  {
    comment: {
      type: String,
      required: [true, 'Comment cannot be empty'],
    },
    createdAt: {
      type: Date,
      default: Date.now(),
    },
    // createdAt: Number,
    // updatedAt: Number,
    post: {
      type: mongoose.Schema.ObjectId,
      ref: 'Post',
      required: [true, 'Comment must belong to a Post'],
    },
    user: {
      type: mongoose.Schema.ObjectId,
      ref: 'User',
      required: [true, 'Comment must belong to a user'],
    },
    replies: [replySchema], //replySchema sub-document - is this the right way?
  },
  {
    // timestamps: { currentTime: () => Math.floor(Date.now() / 1000) },
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
);

replySchema.pre(/^find/, function (next) {
  this.populate({
    path: 'user',
    select: 'name role avatar',
  });
  next();
});

commentSchema.pre(/^find/, function (next) {
  this.populate({
    path: 'user',
    select: 'name role avatar',
  });
  next();
});

const Comment = mongoose.model('Comment', commentSchema);

module.exports = Comment;

用户架构

const userSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      trim: true,
      required: [true, 'Please insert your name'],
    },

    avatar: {
      type: Object,
    },

    role: {
      type: String,
      enum: ['user', 'admin'],
      default: 'user',
    },

  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
);

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

module.exports = User;

非常感谢您抽出宝贵时间!

1 个答案:

答案 0 :(得分:1)

要在回复中填充用户数据:

this.populate([
    'user', // To populate commentSchema's user field
    {
        path: 'replies',
        populate: 'user'
    } // To populate replySchema's user field
]);

编辑:

填充特定字段:

this.populate([
    {
        path: 'user',
        select: 'name role avatar'
    },
    {
        path: 'replies',
        populate: {
            path: 'user',
            select: 'name role avatar'
        }
    }
]);