如何使用猫鼬 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); );
不幸的是,这总是记录null
。 db.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.nick
和obj[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的主要内容,如果未能解决你的问题,请参考以下文章