我目前正在使用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('--')
}
})
})
})
为什么控制台显示的键既未登录.keys
也未登录.getOwnPropertyNames
? console.log输出是反映MongoDB文档中实际内容的输出。
编辑:编辑以使用更合理的代码
答案 0 :(得分:1)
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]
...
}
});
答案 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('--')
})
})
})