【问题标题】:get _id with mongoose用猫鼬获取_id
【发布时间】:2016-11-12 22:15:36
【问题描述】:

我试图使用 Mongoose 控制台.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 的东西。我只是在缩小问题范围。

【问题讨论】:

  • 什么是_doc或如何生成这个_doc?
  • 使用 console.dir(record) 后,它显示 _id 属性位于 _doc 属性中。在某种程度上,我想知道为什么。
  • 你试过record._id吗;

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

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

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

【讨论】:

  • 刚刚添加exec函数时我仍然遇到同样的问题。它不会输出_ids,但是一旦我添加了lean 函数,它就对我有用。仍然觉得这应该更直接。很奇怪。
【解决方案2】:

我想问题出在 .then 上,我从未见过。

MySchemaModel.find({}).then

所以只需尝试使用回调的简单 .exec 调用。

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

【讨论】:

  • 我把 .then 换成了 exec,结果证明使用“promise”语法就可以了,所以这不是问题。使用lean() shaishab roy 提到的用于去除猫鼬的任何额外内容,因此 _id 可以被记录。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    默认情况下,Mongoose 会为您的每个模式分配一个 id 虚拟 getter 它将文档 _id 字段转换为字符串,或者在这种情况下 ObjectIds,它的 hexString。如果您不希望将 id getter 添加到 您的架构,您可以在架构处通过此选项禁用它 施工时间。

    Source: Mongoose Docs

    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'
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-04-18
        • 2013-06-19
        • 2016-11-06
        • 2021-11-11
        • 1970-01-01
        • 2020-10-23
        • 2012-05-08
        • 2023-02-22
        • 2018-06-15
        相关资源
        最近更新 更多