Возврат одного ключа из MongoDB с помощью Mongoose - PullRequest
1 голос
/ 05 августа 2020

Единственное, что я пытаюсь сделать, это вернуть ключ messages из MongoDB, используя Mon goose в Express, но это оказывается немного сложнее, чем должно, в основном из-за всех старые ответы и способы сделать это. Так что лучше поспрашивать и оставить что-нибудь для тех, кто пытается достичь того же.

Это схема, которая содержит ключ сообщений:

const UserMessagesScheme = new mongoose.Schema({
    email: {
        type: String,
        required: true
    },
    messages: {
        type: Object,
        required: true,
        default: {}
    }
}, {minimize: false});

Что я пробовал:

const messages = await Messages.findOne({email}, general).schema.paths.messages;
const messages = await Messages.findOne({email}, general).schema.tree.messages;
const messages = await Messages.findOne({email}, general).lean().messages;
const messages = await Messages.findOne({email}, general).lean().exec((err, res) => res.messages);
const messages = await Messages.findOne({email}, general).lean().exec((err, res) => res._doc.messages);
const messages = await Messages.findOne({email}, general).lean().exec((err, res) => res.toObject().messasges);

// And a heck of a lot more...

console.log(resData.messages);

Что работает?

const messages = await Messages.findOne({email}, general).then(res => res.messages);

console.log(resData.messages);

Хотя мне удалось заставить его работать с .then () Я не совсем уверен это практично, потому что, как вы, вероятно, можете сказать, эта строка кода выполняется внутри функции asyn c, поэтому я хотел бы найти способ сохранить чистоту, используя те же значения.

Другой способ сделать это, который работал, был примерно таким:

const messages = await Messages.findOne({email}, general).lean();
const messagesFromMessages = messsages.messages;

console.log(resData.messages);

Я почти уверен, что мне что-то не хватает, и что мне нужны некоторые знания, чтобы asp это , как таковой, и поскольку другие люди могут столкнуться с этим снова, мне бы очень хотелось, чтобы некоторые ссылки do c или что-то объясняющее то, что я не знаю, кроме примера кода: это то, что вы должны были сделать, пожалуйста.

Всем привет! * 1 022 *

1 Ответ

1 голос
/ 05 августа 2020

Mon goose модель findOne возвращает обещание, которое необходимо либо дождаться, либо продолжить с использованием стиля .then() / callback. Во всех ваших случаях await gets применяется после всей цепочки вызовов методов / чтений полей, поэтому вам нужно, чтобы await выполнялся первым, а база данных возвращалась. Если вы пытаетесь прочитать ожидающее обещание (до того, как база данных выдаст результат), попробуйте:

(await Messages.findOne({email}, general)).messages

или

let databaseResponse = await Messages.findOne({email}, general)
let messagse = databaseResponse.messages;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...