如何在猫鼬模式中填充已引用到另一个模式的字段,并且将该模式进一步引用到另一个模式?

时间:2020-11-01 10:30:11

标签: node.js mongoose mongoose-schema

我要在用户架构中填充的字段(viewed_posts):

viewed_posts: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Viewed"
    }
  ]

查看的架构:

var viewedSchema = new mongoose.Schema({

    hitsByUser: {type: Number, default: 0},
    viewsByUser: {type: Number, default: 0},
    post: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post"
    }
  
});

发布架构:

var mongoose = require('mongoose');

var passportLocalMongoose = require("passport-local-mongoose");
var uniqueValidator = require('mongoose-unique-validator');
var marked = require('marked');
var slugify = require('slugify');
// this is done for sanitizing html so that user cannot write a script in the input
const createDomPurify = require('dompurify')
const {JSDOM} = require('jsdom')
const dompurify = createDomPurify(new JSDOM().window)


var postSchema = new mongoose.Schema({
  postNumber: Number,
  title: String,
  content: String,
  subject: String, // currently we have 4 subjects so one out of 4 subjects will be stored here
  likes: {type:Number,default:0},
  // likes: {
  //   id:{
  //     type: mongoose.Schema.Types.ObjectId,
  //     ref: "User"
  //   }
  // },
  views: {type:Number,default:0},
  actualViews: {type:Number,default:0},
  shares: Number,
  isReviewedByAdmin: {type: Boolean, default: false},
  isReviewedByAuditor: {type: Boolean, default: false},
  author: {
    id:{
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    },
    username: {
      type: String
    }
  },
  publish_date: {
    type: String, 
    default: Date.now
  },
  publishDay: String,
  slug: {
    type: String,
    required: true,
    
  },
  sanitizedHtml: {
    type: String,
    required: true
  },
  
  imagename: String                                        //2002-12-09
});

我希望看到整个结构都已打印,但是我只能填充viewed_posts,如何填充“ post” 在已查看的架构内部,请参见此处:

User.findById(req.user._id).populate("viewed_posts").exec((err,ans)=>{
                  if(err) console.log(err)
                  else{
                    
                    
                    console.log("this is the answer ",ans)
                 }})

我得到的输出:

 },
    {
      hitsByUser: 0,
      viewsByUser: 0,
      _id: 5f9e85aeec37700f54a4d029,
      post: 5f9a93d38d7cf8544ce9cc21,
      __v: 0
    },
    {
      hitsByUser: 0,
      viewsByUser: 0,
      _id: 5f9e85d61841000478c85f8a,
      post: 5f82773f1998150024d4c8fc,
      __v: 0
    },

但是我希望这篇文章也能得到扩展,而不仅仅是显示id,我该如何实现。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

猫鼬支持嵌套填充(请参见文档:https://mongoosejs.com/docs/populate.html#deep-populate)。 请注意,您必须在我放置“ post-model-name” 占位符的位置指定发布模式的模型名称。

所以您可以尝试这样的事情:

User.findById(req.user._id)
  .populate({ 
     path: 'viewed_posts',
     populate: {
       path: 'post',
       model: 'post-model-name'
     } 
  })
  .exec();