Javascript console.log、Object.keys和Object.getOwnPropertyNames之间不一致
我目前正在使用Mongoose,但是所有这些隐藏的密钥都让我抓狂,当这些密钥不知从何处冒出来时,会扰乱我的工作流程。这是我的代码-它只是从find函数记录文档: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
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