为啥循环通过 Mongoose 对象会显示元数据?

Posted

技术标签:

【中文标题】为啥循环通过 Mongoose 对象会显示元数据?【英文标题】:Why Does Looping Through a Mongoose Object Display Metadata?为什么循环通过 Mongoose 对象会显示元数据? 【发布时间】:2017-04-02 15:53:42 【问题描述】:

为什么用 nunjucks 循环遍历 mongoose 对象会显示元数据?

我正在编写的应用程序中使用 mongodb 和 nunjucks。

我正在尝试遍历名为 persona 的模型,但这样做会显示与记录关联的 mongoose 元数据。

如果我只是通过写persona 来显示persona 变量。

我的输出如下。只是在我的架构中定义的键/值。

 _id: 582f186df1f05603132090d5, name: 'Alex', name_lower: 'alex', __v: 0, 
meta:  validated: null, contributors: 'Research Team', sources: '4 Interviews' , 
pain_points:  points: 'Debugging' , 
ideal_day:  responsibilities: 'Coding websites.', goals: 'Finish the research site.', joys: 'Good code, Good food.', hobbies: 'Dance, Hiking, Eating' , 
environment:  workspace: 'Desk', tools: 'Atom, Sketch', info_from: null, info_to: null, coworkers_relationship: null, technology_relationship: null , 
basic_info:  jobtitle: 'FED', experience: '2', education: 'CS', company: ''  

但是,如果我遍历 persona

% for name, item in persona % 名称:项目 % endfor %

除了显示我的架构中的键之外,还将显示与记录关联的所有 mongoose 元数据。我想了解为什么在循环对象时会显示不同的信息。

$__ 是新的 错误 _doc $__original_save 保存 _pres _posts $__original_validate 证实 $__original_remove 消除 D b 鉴别器 __v ID _ID 元 痛点 理想日 环境 基础信息 更新时间 created_at name_lower 姓名 图式 收藏 $__handleSave $__保存 $__delta $__版本 增量 $__哪里

我能够通过使用 Mongoose 的 lean() 解决此问题,但仍然不明白为什么我会遇到这种行为。

【问题讨论】:

【参考方案1】:

当您调用persona 时,结果为persona.toString()。 如果对象没有覆盖方法toString,则结果将为[Object object](默认为toString 方法)。

当你使用循环 % for key, value in persona % 时,它等于

for(var key in obj)
  print(key + ' - ' + obj[key]);

此代码打印所有对象属性和方法。

要排除方法,你必须使用下一个循环

for(var key in obj)
  if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
      print(key + ' ' + obj[key]);

因此,为避免您的问题,您必须在将数据传递给 nunjucks 或输出之前“清除”数据。 你可以定义custom filter

var env = nunjucks.configure(...

env.addFilter('lean', function(obj) 
    var res = ;
    for(var key in obj)
        if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
           res[key] = obj[key];
    return res;
);
...
% for key, value in persona | lean %
key - value
% endfor %

【讨论】:

以上是关于为啥循环通过 Mongoose 对象会显示元数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Mongoose 用 _id 替换对象中的键/值对?

关于NodeJs为啥要用mongoose操作mongodb

MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?

为啥将项目添加到空白数组中会重复显示项目?

使用模式方法在 Mongoose For 循环中保存项目

为啥具有对象基础的元类会引发元类冲突?