我目前正在使用 Mongoose,但是所有这些隐藏的键都让我发疯,并且当这些键突然冒出来时扰乱了我的工作流程。这是我的代码 - 它只是从查找函数中记录文档:
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('--')
}
})
})
})
为什么控制台日志显示的 key 既不在 .keys
也不在 .getOwnPropertyNames
中? console.log 输出反射(reflect)了 MongoDB 文档中的实际内容。
编辑:编辑使用更合理的代码
最佳答案
docs
是 Mongoose 文档对象的列表。它们没有可用于枚举的字段,定义了访问器,使它们可用作 doc.fieldName
。
有文档toObject
和 toJSON
在需要时将文档对象转换为普通对象的方法。
这里的实际问题是因为不需要文档对象,所以不应该查询它们。可以使用 lean
检索普通对象。
Kitten.find({}).lean().exec((err, docs) => {
for (var i = 0; i < docs.length; ++i) {
const doc = docs[i]
...
}
});
关于javascript - console.log、Object.keys 和 Object.getOwnPropertyNames 之间的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813142/