【问题标题】:Mongoose document returns "undefined" in dot notationMongoose 文档以点表示法返回“未定义”
【发布时间】:2020-10-12 18:57:31
【问题描述】:

我有一个 MongoDB 文档,当以点表示法引用时,它返回某些值作为 undefinednull

这是文档的结构:

{
    "id": "1",
    "version": "1.0.0",
    "categories": [], // Array of Category Objects
    "bypass": [] // Array of Strings
}

我使用 Mongoose 如下:Model.findOne({ id: "1" }, { _id: 0 }) 成功返回文档,但是,使用点符号提取特定元素或将它们分配给变量会导致某些元素响应为 null 或 undefined。

例如,如果我返回的文档存储在doc 中,doc.categories 将返回我创建的类别对象的完整数组[]doc.version 返回1.0.0

但是,当我尝试doc.bypass 时,我得到undefined。如果我尝试doc.id,我会得到null

有人知道发生了什么吗?

代码编辑:

const doc = await Model.findOne({ id: "1" }, { _id: 0 });

console.log(doc); // Contains all document data including bypass with its Array of Strings
console.log(doc.bypass); // undefined

返回:

{
    id: '1',
    version: '1.0.0',
    categories: [
        {
            name: 'Category 1',
            id: '1111',
            active: true,
            children: [Array]
        },
        {
            name: 'Category 2',
            id: '2222',
            active: true,
            children: [Array]
        },
        {
            name: 'Category 3',
            id: '3333',
            active: true,
            children: [Array]
        },
        {
            name: 'Category 4',
            id: '4444',
            active: true,
            children: [Array]
        }
    ],
    bypass: [ '123', '456', '78', '90' ]
}
undefined

【问题讨论】:

  • 我不太确定您是如何处理这个问题的,因为没有代码示例说明您如何尝试检索数据 - 例如,如果您在承诺中运行这些数据请求,或者如果它们在异步函数中运行或回调,这可能会影响数据被回调的天气(因为取决于代码运行的时间......数据可能不存在) - 您添加代码的任何机会什么时候运行和什么时候不运行的例子?
  • @Wally 我很抱歉。代码已编辑。
  • 能否请您打印console.log(doc)的返回代码 // 另附注-第二个返回有_id:0
  • @Wally 是的。包括上述代码的输出。另外,我添加了{ _id: 0 } 以避免包含分配的MongoDB _id
  • 这能回答你的问题吗? Can't access object property of a Mongoose response 您需要使用 .lean() 并确保您尝试访问的字段列在架构​​中..

标签: javascript node.js mongodb mongoose


【解决方案1】:

查看以上内容,它应该可以正常工作 - 所以更多的是关于您如何设置模型的问题 - 作为参考,我已将其放在工作模型下方,请对照我的示例进行检查,看看您的模型是否在与此一致:

 const mongoose = require('mongoose')
const validator = require('validator')

const Task = mongoose.model('Task', {
    description: {
        type: String, 
        trim: true,
        required: true
        },
    completed: {
        type: Boolean,
        default: false
        }
})

module.exports = Task

如果它符合这个并且您仍然遇到问题,我可以要求您在上面的代码中发布您的模型吗?

谢谢 - W

【讨论】:

  • Wally,我好像已经很久了,我完全忘记更新 Mongoose 架构了...谢谢!!!
  • 没有戏剧@teej - 我很清楚这种感觉 - 很高兴能提供帮助:)
猜你喜欢
  • 2011-12-08
  • 2017-12-14
  • 2020-08-24
  • 2020-07-11
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2022-01-21
  • 2013-06-30
相关资源
最近更新 更多