尝试填充猫鼬模式

时间:2021-06-30 04:13:23

标签: node.js mongodb mongoose

这个问题似乎很常见,但答案却各不相同。我正在尝试用他们的数据填充这两个模型。

const express = require('express');
const mongoose = require('mongoose');

const app = express();

app.listen(4000,()=>{
    console.log('server listening on port 4000')
});


mongoose.connect('mongodb://localhost:27017/testDB',{useNewUrlParser:true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify:true });

const UserSchema = new mongoose.Schema({
    username: String,
})

const PostSchema = new mongoose.Schema({
    content: String,
    author: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User',
    }
  })

const Post = mongoose.model('Post', PostSchema);
const User = mongoose.model('User', UserSchema);

const user = new User({
    username: 'alex antoine',
})

const posts = new Post({
    content: 'I hope this works'
})

UserSchema.virtual('Post',{
    localField: '_id',
    foreignField: 'author',
    ref:'Post',
})

const populateUser = async(username)=>{

    const user = await User.findOne({username}).populate('posts');

    const userPopulated = await user.populate('Post').execPopulate();

    console.log(userPopulated);
}

const save = async()=>{

    user.save();
    posts.save();
}

save();

populateUser('alex antoine');

我收到的回复是

Populated User {
  posts: [],
  _id: 60dbe989fd1ab074d0ab0541,
  username: 'alex antoine',
  __v: 0
}

这似乎是很多人都遇到的一个常见问题,但他们的答案似乎都不适合我。提前致谢。

2 个答案:

答案 0 :(得分:1)

您没有将用户的帖子声明为虚拟字段权利。您的 PostSchema 是正确的,但您的 UserSchema 应如下所示:

const UserSchema = new mongoose.Schema({
  username: String
})

UserSchema.virtual('posts', {
  ref: Posts,
  localfield: '_id',
  foreignField: 'author'
});

这样,在处理用户文档时,您可以填充其帖子:

user.populate('posts').execPopulate();

答案 1 :(得分:0)

result User.findOne({username}).populate('posts').exec();

// 在 exec() 尝试使用 execPopulate()

然后在 ref 添加 required: true` 选项