如何使用猫鼬findOne

发布于 2024-11-29 10:29:17 字数 459 浏览 1 评论 0原文

我有以下模式(很抱歉它在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'}) 始终返回一个值。到底是怎么回事?

I have the below schema (apologies that it is in coffeescript)

Schema = mongoose.Schema

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

I simply want to recover one record which is definitely in my database:

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

Unfortunately this always logs null. db.auths.findOne({nick: 'noname'}) in mongo shell always returns a value. What is going on?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

書生途 2024-12-06 10:29:17

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

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

Found the problem, need to use function(err,obj) instead:

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
风月客 2024-12-06 10:29:17

Mongoose 基本上包装了 mongodb 的 api,为您提供伪关系数据库 api,因此查询不会与 mongodb 查询完全相同。 Mongoose findOne 查询返回一个查询对象,不是文档。您可以按照解决方案的建议使用回调,或者从 v4+ 开始 findOne 返回一个 thenable,以便您可以使用 .then 或 wait/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 async auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

如果您想使用第三方 Promise 库,请参阅 文档

Mongoose basically wraps mongodb's api to give you a pseudo relational db api so queries are not going to be exactly like mongodb queries. Mongoose findOne query returns a query object, not a document. You can either use a callback as the solution suggests or as of v4+ findOne returns a thenable so you can use .then or await/async to retrieve the document.

// 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 async auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

See the docs if you would like to use a third party promise library.

∞琼窗梦回ˉ 2024-12-06 10:29:17

在我的情况下,存在同样的错误,我正在使用 Asyanc/Await 函数,因为这需要为

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

上面的 findOne 添加 AWAIT,foundUser 在两种情况下都始终包含对象值,无论用户是否找到,因为它在完成 findOne 之前返回值。

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

上面,如果用户不存在于提供条件的集合中,foundUser 将返回 null。如果用户找到,则返回用户文档。

In my case same error is there , I am using Asyanc / Await functions , for this needs to add AWAIT for findOne

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

above , foundUser always contains Object value in both cases either user found or not because it's returning values before finishing findOne .

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

above , foundUser returns null if user is not there in collection with provided condition . If user found returns user document.

陌路终见情 2024-12-06 10:29:17

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

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

这将始终输出所有参数,无论您有多少个参数。

You might want to consider using console.log with the built-in "arguments" object:

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

This will always output all of your arguments, no matter how many arguments you have.

盗梦空间 2024-12-06 10:29:17

我想给出 2023 年的更新答案。使用列出的方法,我无法让它工作并收到错误:

MongooseError: Model.findOne() no longer accepts a callback

我让它工作的方式是使用承诺。

Auth.findOne({nick: 'noname'}).then(user=>{

    if(user){
        //do something
    }

}).catch(err=>{handle err})

I wanted to give an updated answer for 2023. Using the listed methods I was unable to get it to work and got the error:

MongooseError: Model.findOne() no longer accepts a callback

The way I got it to work is using promises.

Auth.findOne({nick: 'noname'}).then(user=>{

    if(user){
        //do something
    }

}).catch(err=>{handle err})
笔落惊风雨 2024-12-06 10:29:17

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

Use obj[0].nick and you will get desired result,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文