使用mongoose获取_id

ocebsuys  于 2022-12-13  发布在  Go
关注(0)|答案(6)|浏览(277)

我尝试使用Mongoose来console.log(record._id)我的mongodb集合中的所有记录。我一直得到每个_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
  });

});

但是,这看起来很糟糕。有更好的方法吗?
注意:这不仅仅是影响console.log的问题,我只是把问题缩小。

4szc88ey

4szc88ey1#

如果你想自定义/编辑记录,那么你应该使用.lean()函数。.lean()函数会把它变成一个普通的JavaScript对象。如果你不使用.lean()函数,那么每个记录仍然是一个mongoose文档,并且_id在那个上下文中的行为是不同的。所以可以使用like

MySchemaModel.find({}).lean().exec(function(error, records) {
  records.forEach(function(record) {
    console.log(record._id);
  });
});

**B:**当使用.exec()时,第一个参数用于错误,第二个参数用于成功数据。

c8ib6hqw

c8ib6hqw2#

Mongoose默认为每个模式分配一个id虚拟getter,它返回documents _id字段,该字段被转换为字符串,或者在ObjectIds的情况下,返回它的hexString。如果你不想在模式中添加id getter,你可以在构建模式时通过这个选项禁用它。
来源: Mongoose 文档

var schema = new Schema({ name: String }, { id: false });
var Page = mongoose.model('Page', schema);
var p = new Page({ name: 'mongodb.org' });
console.log(p.id); // '50341373e894ad16347efe01'
pcww981p

pcww981p3#

我想问题是。那么保证,我从来没有见过。

MySchemaModel.find({}).then

因此,只需尝试使用回调函数进行简单的.exec调用。

MySchemaModel.find({}).exec(function(records) {
    records.forEach(function(record) {
    console.log(record._id);
  });
});
i7uq4tfw

i7uq4tfw4#

问题是每个记录仍然是mongoose文档,_id在该上下文中的行为不同,.lean()函数会将其转换为普通的JavaScript对象。

MySchemaModel.find({}).lean().then(function(records) {
  records.forEach(function(record) {
    console.log(record._id);
  });
});
nc1teljy

nc1teljy5#

您也可以使用.map()方法:

MySchemaModel.find({}).exec(function(records) {
    console.log(records.map(record => record._id);
});
pxy2qtax

pxy2qtax6#

如果您使用的是模型,则不会获得完整的对象,而是_doc的示例作为记录,因此您应该直接

console.log(record._id)

console.log(record._id.valueOf())

但是当你返回record作为响应时,你会得到完整的对象,所以最好使用.find().lean()

相关问题