mongoose查询在node.js中不起作用,但在mongo shell中有效

时间:2015-01-22 17:43:45

标签: node.js mongodb shell mongoose mongo-shell

我正在尝试根据' userId'来获取待办事项列表。存放在待办事项中。使用以下代码不返回任何行。

DB.TodoTable.find({ "userId" : ObjectId("54c12f5f3620c07019e6b144") }, function(err, todos) {
    if (err) return console.error(err);

    console.dir(todos);
})

mongoose调试给出:

Mongoose: todos.find({ userId: undefined }) { fields: undefined }
[]

但是,当我在mongo shell中尝试相同时,它可以工作。如下:

> db.todos.find()
{ "_id" : ObjectId("54c12f643620c07019e6b145"), "created_at" : ISODate("2015-01-22T17:12:04.932Z"), "userId" : ObjectId(
"54c12f5f3620c07019e6b144"), "text" : "data", "__v" : 0 }

我的数据库架构如下:

var TodoTable = mongoose.model('todos', {
    text : {type : String, default: ''},
    created_at : Date,
    userId : {type:ObjectId, ref:'users'}
});

var UserTable = mongoose.model('users', {
    username: String,
    password: String,
    email: String,
    gender: String,
    address: String
});

1 个答案:

答案 0 :(得分:4)

令人困惑的是,mongoose.Schema.ObjectId不是ObjectID构造函数,它只是用于定义模式。

但是你不需要从那个字符串创建一个ObjectID,因为Mongoose会根据模式定义为你做这个,所以你可以简单地使用:

DB.TodoTable.find({ "userId": "54c12f5f3620c07019e6b144" }, function(err, todos) {...})

或者如果您处于需要明确的情况,您可以访问ObjectID构造函数:

DB.TodoTable.find({ "userId": mongoose.mongo.ObjectID("54c12f5f3620c07019e6b144") }, 
    function(err, todos) {...})