Javascript console.log、Object.keys和Object.getOwnPropertyNames之间不一致

Javascript console.log、Object.keys和Object.getOwnPropertyNames之间不一致,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我目前正在使用Mongoose,但是所有这些隐藏的密钥都让我抓狂,当这些密钥不知从何处冒出来时,会扰乱我的工作流程。这是我的代码-它只是从find函数记录文档: const mongoose = require('mongoose') const Kitten = mongoose.model('Kitten', mongoose.Schema({ name: String })); mongoose.connect('mongodb://localhost/test') mongoose.c

我目前正在使用Mongoose,但是所有这些隐藏的密钥都让我抓狂,当这些密钥不知从何处冒出来时,会扰乱我的工作流程。这是我的代码-它只是从find函数记录文档:

const mongoose = require('mongoose')
const Kitten = mongoose.model('Kitten', mongoose.Schema({ name: String }));

mongoose.connect('mongodb://localhost/test')
mongoose.connection.on('error', console.log)
mongoose.connection.once('open', function() {
    var fluffy = new Kitten({ name: 'fluffy' })
    fluffy.save((err, fluffy) => {
        if (err) return console.error(err);
        Kitten.find({}, (err, docs) => {
            for (var i = 0; i < docs.length; ++i) {
                const doc = docs[i]
                console.log('Object.getOwnPropertyNames ', Object.getOwnPropertyNames(doc))
                console.log('Object.keys ', Object.keys(doc))
                console.log(doc)
                console.log('--')
            }
        })
    })
})
const mongoose=require('mongoose'))
const Kitten=mongoose.model('Kitten',mongoose.Schema({name:String}));
猫鼬mongodb://localhost/test')
mongoose.connection.on('error',console.log)
mongoose.connection.once('open',function()){
var fluffy=新小猫({name:'fluffy'})
fluffy.save((错误,fluffy)=>{
if(err)返回控制台。error(err);
Kitten.find({},(呃,文档)=>{
对于(变量i=0;i
其中一个记录的文档是

为什么控制台日志显示的键既不在
.keys
中,也不在
中.getOwnPropertyNames
中?log输出是反映MongoDB文档中实际内容的输出

编辑:编辑以使用更合理的代码

从“查找”中得到的结果是游标。您需要使用“toArray”将文档加载到RAM

const mongoose = require('mongoose')
const Kitten = mongoose.model('Kitten', mongoose.Schema({ name: String }));

mongoose.connect('mongodb://localhost/test')
mongoose.connection.on('error', console.log)
mongoose.connection.once('open', function() {
    var fluffy = new Kitten({ name: 'fluffy' })
    fluffy.save((err, fluffy) => {
        if (err) return console.error(err);
        Kitten.find({}).toArray((err, doc) => {
                console.log('Object.getOwnPropertyNames ', Object.getOwnPropertyNames(doc))
                console.log('Object.keys ', Object.keys(doc))
                console.log(doc)
                console.log('--')
        })
    })
})

docs
是Mongoose文档对象的列表。它们没有可用于枚举的字段,但定义了访问器,使它们可以作为
doc.fieldName
使用

有文档和方法可以在需要时将文档对象转换为普通对象

这里的实际问题是,因为不需要文档对象,所以不应该查询它们。可以使用
lean
检索普通对象

    Kitten.find({}).lean().exec((err, docs) => {
        for (var i = 0; i < docs.length; ++i) {
            const doc = docs[i]
            ...
        }
    });
Kitten.find({}).lean().exec((错误,文档)=>{
对于(变量i=0;i
尝试使用
console.dir(doc)它可能会给你更多的变量来使用。不幸的是,console.dir输出与console.log相同的东西,因此没有新的信息。这就是它!我不知道每个
doc
都是猫鼬.Document的
实例。我觉得关于Mongoose的文档没有在适用的地方阐明这一点,也没有明确区分Mongoose文档和我应该通过find函数获取的MongoDB文档之间的区别。非常感谢。不客气。顺便说一句,奇怪的是,由于Mongoose长期支持承诺,回调仍然被使用。它们产生了更直接的控制流,特别是使用async/await