我正试图在两个猫鼬收藏之间建立联系。这样,用户的信息将存储在名为用户的集合中,而他的内容将存储在另一个集合中。 到目前为止,我已经从here复制了一些代码并对其进行了编辑;
然后用邮递员创建了一个名为“ example”的用户名; 然后我创建了一个内容随机的帖子,作为作者,我将其设置为“ example”,但似乎不起作用,当我输入“ / test”时它会记录:
受欢迎的用户{帖子:[],_ id:5c530cd4ede117109cf1a5e9,
用户名:“ example”,__ v:0}
您看到的帖子是空的,为了解决该问题,我应该更改什么?
const UserSchema = new mongoose.Schema({
username: String,
posts: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Post'
}]
})
const PostSchema = new mongoose.Schema({
content: String,
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
})
function getUserWithPosts(username){
return User.findOne({ username: username })
.populate('posts').exec((err, posts) => {
console.log("Populated User " + posts);
})
}
const Post = mongoose.model('Post', PostSchema, 'posts');
const User = mongoose.model('User', UserSchema, 'users');
app.post('/testUser', (req, res) => {
var username = req.body.username;
var clientModel = new User({
username: username,
});
clientModel.save(function (error) {
if (error) {
console.log(error);
}
res.send({
success: true,
username: username,
message: 'account saved successfully!'
});
});
});
app.post('/testPost', (req, res) => {
var content = req.body.content;
var author = req.body.author;
var clientModel = new Post({
content: content,
author: author
});
clientModel.save(function (error) {
if (error) {
console.log(error);
}
res.send({
success: true,
content: content,
author: author,
message: 'account saved successfully!'
});
});
});
app.get('/test', (req, res) => {
res.send({
posts: getUserWithPosts("example")
})
});
答案 0 :(得分:0)
我现在看到这里发生了什么。看来您有一个循环引用的问题。您的user.posts引用了用户创建的帖子。 posts.author引用创建帖子的作者。如果要执行此操作,则在创建post对象后,必须进入并更新用户对象,然后传递post._id。
您可以做另一件更好的事情。您可以使用虚拟机。猫鼬可以计算引用其他集合的值运行时间。这是我的建议。缺点是,虚拟机未存储在数据库中,并且每次需要时都必须显式填充此字段。这是一个例子:
用户模型
const UserSchema = new mongoose.Schema({
username: String
})
UserSchema.virtual('posts', {
ref: 'Post',
localField: 'username',
foreignField: 'author',
justOne: false
});
这将创建虚拟的,并且每当您找到用户并调用.populate('posts')时,您都会获得该用户已编写的帖子数组。
在此处了解有关猫鼬虚拟物品的更多信息:http://thecodebarbarian.com/mongoose-virtual-populate