Mongoose返回空,而mongodb shell中的相同查询工作正常

时间:2017-06-01 07:44:30

标签: node.js mongodb mongoose mongoose-schema

我知道也许这个问题在这里被问过很多次了,我已经通过了几个解决方案来解决类似的问题,但在我的案例中似乎没有任何帮助。

我有两个名为usersposts的集合,它们的模型如下所示:

用户

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,所以也许我错过了什么。

提前谢谢!

1 个答案:

答案 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);
    }
);

现在一切都按预期工作了。