我知道也许这个问题在这里被问过很多次了,我已经通过了几个解决方案来解决类似的问题,但在我的案例中似乎没有任何帮助。
我有两个名为users
和posts
的集合,它们的模型如下所示:
用户
var mongoose = require('mongoose').set('debug', true);
var Schema = mongoose.Schema;
var usersSchema = new Schema({
name: {type: String, required: true}
});
var User = mongoose.model('user', usersSchema, 'users');
module.exports = User;
帖子
var mongoose = require('mongoose').set('debug', true);
var Schema = mongoose.Schema;
var postsSchema = new Schema({
content: String,
user: {
type: Schema.ObjectId,
ref: 'users',
required: true
}
});
var Post = mongoose.model('post', postsSchema, 'posts');
module.exports = Post;
我正在尝试使用此代码获取用户的帖子:
var Post = require('../models/posts');
...
router.get('/posts/user/:userId', function (req, res, next) {
Post.find({user: req.params.userId}, function (err, posts) {
Post.populate(posts, {path: 'user'}, function(err, posts) {
res.send(posts);
});
});
});
Mongoose调试模式报告在请求期间执行以下查询:
posts.find({ user: ObjectId("592e65765ba8a1f70c1eb0bd") }, { fields: {} })
在mongodb shell中运行得很好(我使用的是Mongoclient)但是使用Mongoose这个查询返回一个空数组。
我在mongodb shell中运行的查询:
db.posts.find({ user: "592e65765ba8a1f70c1eb0bd" })
我得到的结果:
{ "_id" : ObjectId("592e66b48f60c03c1ee06445"), "content" : "Test post 3", "user" : "592e65765ba8a1f70c1eb0bd" }
{ "_id" : ObjectId("592e66b98f60c03c1ee06446"), "content" : "Test post 4", "user" : "592e65765ba8a1f70c1eb0bd" }
{ "_id" : ObjectId("592e66bb8f60c03c1ee06447"), "content" : "Test post 5", "user" : "592e65765ba8a1f70c1eb0bd" }
我刚开始学习Node.JS和MongoDB,所以也许我错过了什么。
提前谢谢!
答案 0 :(得分:1)
正如Neil Lunn建议的那样,我检查了用户字段类型,它确实是String类型而不是ObjectId,因此存储在集合中的数据与查询中的字段类型之间存在类型不匹配。
我使用此代码将用户字段类型从String转换为我的集合中的ObjectId:
db.getCollection('posts').find().forEach(function (post) {
db.getCollection('posts').remove({ _id : post._id});
tempUserId = new ObjectId(post.user);
post.user = tempUserId;
db.getCollection('posts').save(post);
}
);
现在一切都按预期工作了。