在 MongoDB 中将 ObjectId 与 Mongoose 一起使用
Posted
技术标签:
【中文标题】在 MongoDB 中将 ObjectId 与 Mongoose 一起使用【英文标题】:Using ObjectId with Mongoose in MongoDB 【发布时间】:2015-07-19 11:47:47 【问题描述】:我最近开始将 MongoDB 与 Mongoose 一起使用,并且有一个可能看起来很简单的问题。 到目前为止,我有两个模型,一个用户和一个帖子。帖子归用户所有,由 ObjectId 引用。 以下是模型:
发帖
var mongoose = require('mongoose');
var PostSchema = new mongoose.Schema(
text: String,
stars: type: Number, default: 0 ,
score: type: Number, default: 0 ,
user: type: mongoose.Schema.Types.ObjectId, ref: 'User', default: '554cb70669234d6f04f425a2'
);
PostSchema.methods.addstar = function(cb)
this.stars += 1;
this.save(cb);
;
mongoose.model('Post', PostSchema);
用户
var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');
var UserSchema = new mongoose.Schema(
username: type: String, lowercase: true, unique: true,
hash: String,
salt: String
);
mongoose.model('User', UserSchema);
当我想使用带角度的 html 页面上的数据时,我试图通过以下方式访问用户名:
post.user.username
但是这并没有产生任何结果。 我是否需要使用用户 ID 发出单独的获取请求,还是他们更直观的方式?
如前所述,我理解这个问题可能看起来很基本。我刚刚学习 Mongo,之前使用过 Rails 数据库,其中很多功能都被掩盖了。
有什么想法吗?
【问题讨论】:
【参考方案1】:也许答案就在这里: Referencing another schema in Mongoose
总结:
当您进行查询时,您可以像这样填充引用:
Post.findOne(_id: 123)
.populate('user')
.exec(function(err, post)
// do stuff with post
);
所以在执行查找之前,您告诉 mongo 填充用户。
【讨论】:
谢谢@tuvokki。这适用于一篇文章。在我最初的获取请求中,我收到了所有帖子,并希望填充每个用户名。此代码不起作用:Post.find() .populate('user', 'username') .exec(function (err, posts) if(err) return(err); res.json(posts); );
【参考方案2】:
以下代码返回所有帖子,其中每个帖子都填充了用户。我忘记在 Post.find() 的方法调用中包含空对象。
router.get('/posts', function (req, res, next)
Post.find()
.populate('user')
.exec(function (err, posts)
if(err) return(err);
res.json(posts);
);
);
【讨论】:
太棒了!确实,我的回答针对的是 findOne 方法,但对于其他发现也是如此。以上是关于在 MongoDB 中将 ObjectId 与 Mongoose 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?
使用 java 在 Micronaut 中将 MongoDb ObjectId _id 更改为字符串