Подтвердить что ты не робот

Как использовать mongoose findOne

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

В моем случае такая же ошибка, я использую функции 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 возвращает ноль, если пользователь не находится в коллекции с предоставленным условием. Если пользователь найден, он возвращает документ пользователя.