如何使用mongoose findOne

Cal*_*ers 38 mongoose mongodb node.js coffeescript

我有以下架构(道歉,它是在coffeescript)

Schema = mongoose.Schema

AuthS = new Schema
    auth:   {type: String, unique: true}
    nick:   String
    time:   Date
Auth = mongoose.model 'Auth', AuthS
Run Code Online (Sandbox Code Playgroud)

我只想恢复一条肯定在我的数据库中的记录:

Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });
Run Code Online (Sandbox Code Playgroud)

很不幸,这始终记录null.db.auths.findOne({nick: 'noname'})在mongo shell中总是返回一个值.到底是怎么回事?

Cal*_*ers 82

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

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
Run Code Online (Sandbox Code Playgroud)

  • 当操作成功执行(错误为空),但没有匹配时,文档也将为null. (5认同)
  • 当我像这样使用“findOne”时,我成功获取了数据,但“obj”不是“Document”对象。当我尝试 `obj.nick` 和 `obj[nick]` 时,我得到了未定义的信息。当我尝试 `obj.get('nick')` 时,我得到对象没有 get 方法。我尝试了很多 JSON 转换并创建了一个 `doc = new Document(obj)`。我还尝试了“doc.toObject(obj)”和“doc.set(obj)”; (3认同)
  • @JonathanCzitkovics我认为如果你做obj.toObject()会给你你想要的东西. (2认同)

Isa*_*Pak 12

Mongoose 基本上包装了 mongodb 的 api,为您提供一个伪关系数据库 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 auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

Run Code Online (Sandbox Code Playgroud)

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


Bha*_*nde 7

在我的情况下,存在同样的错误,我使用的是 Asyanc/Await 函数,为此需要为 findOne 添加 AWAIT

Ex:const foundUser = User.findOne ({ "email" : req.body.email });
Run Code Online (Sandbox Code Playgroud)

上面, foundUser 在两种情况下都包含 Object 值,无论是用户找到还是没有找到,因为它在完成 findOne 之前返回值。

const foundUser = await User.findOne ({ "email" : req.body.email });
Run Code Online (Sandbox Code Playgroud)

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