这个问题似乎很常见,但答案却各不相同。我正在尝试用他们的数据填充这两个模型。
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
}
这似乎是很多人都遇到的一个常见问题,但他们的答案似乎都不适合我。提前致谢。
答案 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` 选项