我正在尝试使用Mongoose在我的mongodb集合上使用console.log(record._id)记录所有记录。我为每个_id值保持undefined
。
我挣扎直到遇到this post。然后我用console.dir找到_id的位置,并在我的console.log中使用它:
MySchemaModel.find({}).then(function(records) {
records.forEach(function(record) {
console.log(record._doc._id); // <-- I added ._doc
});
});
但是,这看起来是正确的hacky。有更好的方法吗?
注意:这不仅仅是影响console.log的内容。我只是把问题缩小了。
答案 0 :(得分:2)
如果要自定义/编辑记录,则应使用.lean()
函数。.lean()
函数会将其转换为普通的JavaScript对象。如果您不使用.lean()
函数,则每条记录仍然是一个mongoose文档,_id
在该上下文中的行为也不同。所以可以像
MySchemaModel.find({}).lean().exec(function(error, records) {
records.forEach(function(record) {
console.log(record._id);
});
});
N.B:使用.exec()
时,第一个参数用于错误,第二个参数用于成功数据。
答案 1 :(得分:1)
我想问题是。然后承诺,我从未见过。
MySchemaModel.find({}).then
所以只需使用回调尝试简单的.exec调用。
MySchemaModel.find({}).exec(function(records) {
records.forEach(function(record) {
console.log(record._id);
});
});
答案 2 :(得分:1)
Mongoose默认为每个模式分配一个id虚拟getter,它返回文件_id字段强制转换为字符串,或者在ObjectIds的情况下返回其hexString。如果您不希望将ID getter添加到架构中,则可以在架构构建时禁用它以传递此选项。
var schema = new Schema({ name: String });
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p.id); // '50341373e894ad16347efe01'
答案 3 :(得分:1)
你也可以使用 .map() 方法:
MySchemaModel.find({}).exec(function(records) {
console.log(records.map(record => record._id);
});
答案 4 :(得分:0)
The problem is that each record is still a mongoose document and _id behaves differently in that context. The .lean() function will turn it into a normal JavaScript object.
MySchemaModel.find({}).lean().then(function(records) {
records.forEach(function(record) {
console.log(record._id);
});
});