如何使用mongoose findOne

时间:2011-08-11 21:50:39

标签: node.js mongodb coffeescript mongoose

我有以下架构(道歉,它在coffeescript中)

Schema = mongoose.Schema

AuthS = new Schema
    auth:   {type: String, unique: true}
    nick:   String
    time:   Date
Auth = mongoose.model 'Auth', AuthS

我只想恢复一条肯定在我的数据库中的记录:

Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });

不幸的是,这总是记录null。 mongo shell中的db.auths.findOne({nick: 'noname'})始终返回一个值。到底是怎么回事?

5 个答案:

答案 0 :(得分:76)

发现问题,需要使用function(err,obj)代替:

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });

答案 1 :(得分:2)

您可能需要考虑将console.log与内置的“arguments”对象一起使用:

console.log(arguments); // would have shown you [0] null, [1] yourResult

无论你有多少个参数,这都会输出你的所有参数。

答案 2 :(得分:2)

Mongoose基本上包装了mongodb的api,以便为您提供伪关系数据库api,因此查询不会完全像mongodb查询一样。猫鼬 findOne 查询返回查询对象,不是文档。您可以根据解决方案的建议使用回调,也可以从v4 +开始使用 findOne 返回thenable,以便可以使用.then或await / async来检索文档。

// thenables
Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(doc)});

// To use a full fledge promise you will need to use .exec()
var auth = Auth.findOne({nick: 'noname'}).exec();
auth.then(function (doc) {console.log(doc)});

// async/await
async function auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

如果您想使用第三方承诺库,请参见docs

答案 3 :(得分:0)

使用obj [0] .nick,你会得到想要的结果,

答案 4 :(得分:0)

对于我来说,同样的错误也存在,我正在使用Asyanc / Await函数,因为这需要为findOne添加AWAIT

Ex:const foundUser = User.findOne ({ "email" : req.body.email });

在上述两种情况下,无论是否找到用户,foundUser始终都包含Object值,因为它在完成findOne之前会返回值。

const foundUser = await User.findOne ({ "email" : req.body.email });

以上,如果用户不在提供条件中的集合中,则FoundUser返回null。如果找到用户,则返回用户文档。