Node.js 使用Mongoose从MongoDB返回单键

Node.js 使用Mongoose从MongoDB返回单键,node.js,mongodb,mongoose,mongodb-query,mongoose-schema,Node.js,Mongodb,Mongoose,Mongodb Query,Mongoose Schema,我尝试做的唯一一件事就是在Express中使用Mongoose从MongoDB返回消息键,但事实证明这有点困难,主要是因为所有旧的答案和方法。因此,最好四处打听,为任何试图实现同样目标的人留下一些东西 这是包含消息键的架构: const UserMessagesScheme = new mongoose.Schema({ email: { type: String, required: true }, 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);
我很确定我遗漏了一些东西,我需要掌握一些知识才能掌握这一点,因为其他人可能会再次遇到这一点,我真的很喜欢一些文档链接或一些解释我不知道的东西,除了一个代码示例:这是你应该做的,请


为一切干杯

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


你试过
(等待消息。findOne({email},general)).Messages
?天哪,我不敢相信我搞砸了:),这是我唯一没试过的!而且它与Mongoose/MongoDB无关,我假设我实际上需要等待等待模式响应,以便对其执行
。消息
,对吗?这就是为什么我在那里得到了
未定义的
,因为我在承诺解决之前调用了
.messages
。这是正确的吗?是的,否则在数据库响应之前读取(并等待未定义)
(await Messages.findOne({email}, general)).messages
let databaseResponse = await Messages.findOne({email}, general)
let messagse = databaseResponse.messages;