为啥循环通过 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
除了显示我的架构中的键之外,还将显示与记录关联的所有 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 对象会显示元数据?的主要内容,如果未能解决你的问题,请参考以下文章