如何使用猫鼬 findOne

Posted

技术标签:

【中文标题】如何使用猫鼬 findOne【英文标题】:How to use mongoose findOne 【发布时间】:2011-10-25 09:19:56 【问题描述】:

我有以下架构(很抱歉它在咖啡脚本中)

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); );

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

【问题讨论】:

无需为它出现在 CoffeeScript 中而道歉;只是不要用javascript标记它。 【参考方案1】:

发现问题,需要改用function(err,obj)

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

【讨论】:

当我像这样使用findOne 时,我成功获取了我的数据,但obj 不是Document 对象。当我尝试obj.nickobj[nick] 时,我得到了不确定。当我尝试obj.get('nick') 时,我得到的对象没有get 方法。我尝试了许多 JSON 转换并创建了一个 doc = new Document(obj)。我也试过doc.toObject(obj)doc.set(obj); @JonathanCzitkovics 我认为如果你执行 obj.toObject() 将会给你你想要的东西。 当操作执行成功(err为null),但没有匹配到时,文档也会为null。 但是你是如何在 findOne 中获取对象的呢?我假设此信息将在路线中。 req.body? @JonathanCzitkovics 。谢谢你。但请告诉我原因。仅对于我正在使用的一个项目,对于其他我可以使用的项目。符号【参考方案2】:

Mongoose 基本上包装了 mongodb 的 api,为您提供了一个伪关系 db api,因此查询不会完全像 mongodb 查询。 Mongoose 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 async auth() 
  const doc = await Auth.findOne(nick: 'noname').exec();
  return doc;

auth();

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

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

猫鼬 findOne,更新和执行

猫鼬我如何返回 findOne 数据对象

将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)

节点猫鼬总是在 findOne 上返回错误

猫鼬 findOne :异步和同步之间的不同

猫鼬 findOne 方法返回 null