Как использовать мангуста findOne - PullRequest
37 голосов
/ 12 августа 2011

У меня есть схема ниже (извиняюсь, что это в 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. db.auths.findOne({nick: 'noname'}) в оболочке монго всегда возвращает значение. Что здесь происходит?

Ответы [ 5 ]

79 голосов
/ 12 августа 2011

Нашел проблему, нужно использовать function(err,obj) вместо:

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
3 голосов
/ 20 января 2019

Mongoose в основном оборачивает API mongodb, чтобы дать вам псевдо реляционный API db, поэтому запросы не будут точно такими же, как запросы 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();

См. документы , если вы хотите использовать стороннюю библиотеку обещаний.

2 голосов
/ 28 июля 2016

Возможно, вы захотите использовать console.log со встроенным объектом «arguments»:

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

Это всегда выведет все ваши аргументы, независимо от того, сколько аргументов у вас есть.

0 голосов
/ 20 мая 2019

В моем случае такая же ошибка, я использую функции Asyanc / Await, для этого нужно добавить AWAIT для findOne

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

выше, foundUser всегда содержит значение Object в обоих случаях, либо пользователь обнаружил, либо нет, потому что он возвращает значения до завершения findOne.

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

выше, foundUser возвращает ноль, если пользователь не находится в коллекции с предоставленным условием. Если найденный пользователь возвращает документ пользователя.

0 голосов
/ 09 апреля 2018

Используйте obj [0] .nick, и вы получите желаемый результат,

...