首页 > 解决方案 > 使用 Mongoose 从 MongoDB 返回单个键

问题描述

我唯一想做的就是messages在 Express 中使用 Mongoose 从 MongoDB 返回密钥,但这证明它应该更困难,主要是因为所有旧的答案和这样做的方法。因此,尽管最好四处打听,并为任何试图实现相同目标的人留下一些东西。

这是包含消息键的模式:

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()一起工作,但我不太确定它是否实用,因为你可能会说这行代码是在异步函数内部执行的,因此我想找到一种通过使用相同的实现来保持清洁的方法。

另一种可行的方法是这样的:

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

console.log(resData.messages);

我很确定我错过了一些东西,并且我需要一些知识才能掌握这一点,因此,由于其他人可能会再次遇到这个问题,我真的很喜欢一些文档链接或解释的东西除了代码示例之外,我不知道的是:这是你应该做的,拜托。

为一切加油!

标签: node.jsmongodbmongoosemongodb-querymongoose-schema

解决方案


Mongoose 模型findOne返回一个需要等待或继续使用.then()/ 回调样式的承诺。在您的所有情况下,等待gets整个方法调用链/字段读取后应用,因此您需要括号来强制await首先执行并返回数据库响应。否则,您正在尝试从待处理的承诺中读取(在数据库产生结果之前),请尝试:

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

或者

let databaseResponse = await Messages.findOne({email}, general)
let messagse = databaseResponse.messages;

推荐阅读