【问题标题】:Return single key from MongoDB using Mongoose使用 Mongoose 从 MongoDB 返回单个键
【发布时间】:2020-11-25 13:44:03
【问题描述】:

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

这是包含消息键的架构:

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

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

祝一切顺利!

【问题讨论】:

  • 你试过(await Messages.findOne({email}, general)).messages吗?
  • 天哪,我不敢相信我搞砸了 :)),这是我唯一没有尝试过的东西!而且它与 Mongoose/MongoDB 无关,我假设我实际上需要等待 await Schema 响应才能执行.messages 对吗?这就是为什么我在那里得到undefined 的原因,因为我在承诺解决之前打电话给.messages。这是正确的吗?
  • 是的,否则您在数据库响应之前读取(并等待未定义)

标签: node.js mongodb mongoose mongodb-query mongoose-schema


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 2021-08-13
    • 2016-05-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多