console.log,Object.keys和Object.getOwnPropertyNames

时间:2018-08-12 21:51:33

标签: 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.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('--')
            }
        })
    })
})

记录的文档之一是enter image description here

为什么控制台显示的键既未登录.keys也未登录.getOwnPropertyNames? console.log输出是反映MongoDB文档中实际内容的输出。

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

2 个答案:

答案 0 :(得分:1)

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

有文档toObjecttoJSON方法可在需要时将文档对象转换为纯对象。

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

    Kitten.find({}).lean().exec((err, docs) => {
        for (var i = 0; i < docs.length; ++i) {
            const doc = docs[i]
            ...
        }
    });

答案 1 :(得分:0)

您从“查找”中获得的结果是诅咒者。您需要使用“ 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('--')
        })
    })
})