使用mongoose

时间:2016-07-11 03:54:16

标签: javascript node.js mongodb mongoose

我正在尝试使用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的内容。我只是把问题缩小了。

5 个答案:

答案 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);
  });
});