如何使用mongoose findOne

问题描述 投票:37回答:5

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

node.js mongodb coffeescript mongoose
5个回答
80
投票

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

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

3
投票

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


2
投票

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

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

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


0
投票

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


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。如果用户找到了返回用户文档。

© www.soinside.com 2019 - 2024. All rights reserved.