需要对 mongoose/mongodb 填充命令进行一些说明
Need some clarification on mongoose/mongodb populate command
你好,我正在与用户和 posts 一起制作一个基本的应用程序。
我遵循了有关人口的猫鼬文档 (http://mongoosejs.com/docs/2.7.x/docs/populate.html) 并设置了我的模式,以便用户连接到 posts
var userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
email: String,
created_at: Date,
updated_at: Date,
admin: Boolean,
posts: [{ type: mongoose.Schema.ObjectId, ref: 'Post' }]
});
var postSchema = new mongoose.Schema({
_user : [{ type: mongoose.Schema.ObjectId, ref: 'User' }],
audioFile: { type: String, required: true },
imageFile: { type: String },
title: { type: String, required: true },
artist: { type: String, required: true },
start: { type: String, required: true },
stop: { type: String, required: true },
genre: { type: String, required: true },
tags: [{ type: String }]
});
app.get('/', function (req, res){
Post.find({}, function(err, allPosts){
if(!err){
res.render('main.njk', {
posts : allPosts,
title : 'Title',
isLogged : req.session.isLogged,
user : req.session.user,
messages : req.flash('alert')
});
} else { return done(err); }
});
});
这一切都很好,我可以 运行 allPosts 上的 foreach 循环将每个帖子都拉到我的 HTML 中,但是当我尝试考虑如何显示所有帖子时posts 及其各自的用户附加到每个 post 我不确定如何将两者联系起来,因为 mongoose 文档中的所有示例主要针对 findOne。
我在想这样的事情
app.get('/', function (req, res){
Post.find({}, function(err, allPosts){
if(!err){
allPosts.populate('_user', ['username']);
allPosts.exec(function (err, users){
if(err) console.log(err);
console.log(users);
});
res.render('main.njk', {
posts : allPosts,
title : 'Spaurk.net',
isLogged : req.session.isLogged,
user : req.session.user,
messages : req.flash('alert')
});
} else { return done(err); }
});
});
但这当然行不通。
所以我想知道是否有任何有经验的人能够帮助我解决这个问题。
非常感谢任何意见。
编辑,感谢 Daves 的帮助,我能够使填充正常工作,我只是无法使用
正确地拉出我想要的字段
Post.find({}).populate('_user').exec(function(err, allPosts){
在我的循环中 {% for post in posts %}
,当我执行 post._user 时,它会显示整个用户架构,但是当我执行 post._user.username 时,它不会 return 任何内容。我不确定这是为什么。
构建查询填充的正确方法是这样的:
Post.find({})
.populate('_user')
.exec((err, allposts){...})
然后您将得到一个 Posts
数组,其中填充了 _user
数组。如果您需要访问用户的 属性,您将需要通过 _user
数组进行另一个循环或指定您要使用 _user[0].<property>
你好,我正在与用户和 posts 一起制作一个基本的应用程序。
我遵循了有关人口的猫鼬文档 (http://mongoosejs.com/docs/2.7.x/docs/populate.html) 并设置了我的模式,以便用户连接到 posts
var userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
email: String,
created_at: Date,
updated_at: Date,
admin: Boolean,
posts: [{ type: mongoose.Schema.ObjectId, ref: 'Post' }]
});
var postSchema = new mongoose.Schema({
_user : [{ type: mongoose.Schema.ObjectId, ref: 'User' }],
audioFile: { type: String, required: true },
imageFile: { type: String },
title: { type: String, required: true },
artist: { type: String, required: true },
start: { type: String, required: true },
stop: { type: String, required: true },
genre: { type: String, required: true },
tags: [{ type: String }]
});
app.get('/', function (req, res){
Post.find({}, function(err, allPosts){
if(!err){
res.render('main.njk', {
posts : allPosts,
title : 'Title',
isLogged : req.session.isLogged,
user : req.session.user,
messages : req.flash('alert')
});
} else { return done(err); }
});
});
这一切都很好,我可以 运行 allPosts 上的 foreach 循环将每个帖子都拉到我的 HTML 中,但是当我尝试考虑如何显示所有帖子时posts 及其各自的用户附加到每个 post 我不确定如何将两者联系起来,因为 mongoose 文档中的所有示例主要针对 findOne。
我在想这样的事情
app.get('/', function (req, res){
Post.find({}, function(err, allPosts){
if(!err){
allPosts.populate('_user', ['username']);
allPosts.exec(function (err, users){
if(err) console.log(err);
console.log(users);
});
res.render('main.njk', {
posts : allPosts,
title : 'Spaurk.net',
isLogged : req.session.isLogged,
user : req.session.user,
messages : req.flash('alert')
});
} else { return done(err); }
});
});
但这当然行不通。
所以我想知道是否有任何有经验的人能够帮助我解决这个问题。
非常感谢任何意见。
编辑,感谢 Daves 的帮助,我能够使填充正常工作,我只是无法使用
正确地拉出我想要的字段 Post.find({}).populate('_user').exec(function(err, allPosts){
在我的循环中 {% for post in posts %} ,当我执行 post._user 时,它会显示整个用户架构,但是当我执行 post._user.username 时,它不会 return 任何内容。我不确定这是为什么。
构建查询填充的正确方法是这样的:
Post.find({})
.populate('_user')
.exec((err, allposts){...})
然后您将得到一个 Posts
数组,其中填充了 _user
数组。如果您需要访问用户的 属性,您将需要通过 _user
数组进行另一个循环或指定您要使用 _user[0].<property>