如何使用mongoose findOne

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用mongoose findOne相关的知识,希望对你有一定的参考价值。

我有以下架构(道歉,它是在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'})总是返回一个值。到底是怎么回事?

答案

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

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

Mongoose基本上包装mongodb的api给你一个伪关系db api所以查询不会像mongodb查询一样。 Mongoose findOne查询返回查询对象,而不是文档。您可以根据解决方案的建议使用回调,或者从v4 + findOne返回一个回调,这样您就可以使用.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

另一答案

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

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

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

另一答案

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

另一答案

在我的情况下,同样的错误,我使用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。如果用户找到了返回用户文档。

以上是关于如何使用mongoose findOne的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟像findOne()这样的mongoose查询?

更新 findOne()/find()/findById() 返回的文档 - mongoose

更新 findOne()/find()/findById() 返回的文档 - mongoose

FindOne() mongoose 的问题

如何使用猫鼬 findOne

mongoose.findOne() 返回 null