为什么循环 Mongoose Object 显示元数据?
Why Does Looping Through a Mongoose Object Display Metadata?
为什么使用 nunjucks 循环猫鼬 object 会显示元数据?
我正在编写的应用程序中使用 mongodb 和 nunjucks。
我正在尝试遍历一个名为 persona
的模型,但这样做会显示与记录关联的猫鼬元数据。
如果我只是通过写 {{persona}}
.
来显示 persona
变量
我的输出如下。只是我的架构中定义的 keys/values。
{ _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 %}
{{ name }} : {{ item }}
{% endfor %}
除了显示我的模式中的键外,还将显示与记录关联的所有猫鼬元数据。我想了解为什么在 object 上循环时显示不同的信息。
$__
isNew
errors
_doc
$__original_save
save
_pres
_posts
$__original_validate
validate
$__original_remove
remove
db
discriminators
__v
id
_id
meta
pain_points
ideal_day
environment
basic_info
updated_at
created_at
name_lower
name
schema
collection
$__handleSave
$__save
$__delta
$__version
increment
$__where
我可以使用 Mongoose 的 lean()
解决这个问题,但仍然不明白为什么我会遇到这种情况。
当您调用 {{persona}}
时,结果为 persona.toString()
。
如果对象没有覆盖方法 toString
那么结果将是 [Object object]
(默认 toString
方法)。
当你使用循环时 {% for key, value in persona %}
那么它等于
for(var key in obj)
print(key + ' - ' + obj[key]);
此代码打印所有对象属性和方法。
要排除必须使用 next 循环的方法
for(var key in obj)
if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
print(key + ' ' + obj[key]);
因此,为了避免您的问题,您必须 "clear" 数据,然后再将其传递给 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 %}
为什么使用 nunjucks 循环猫鼬 object 会显示元数据?
我正在编写的应用程序中使用 mongodb 和 nunjucks。
我正在尝试遍历一个名为 persona
的模型,但这样做会显示与记录关联的猫鼬元数据。
如果我只是通过写 {{persona}}
.
persona
变量
我的输出如下。只是我的架构中定义的 keys/values。
{ _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 %} {{ name }} : {{ item }} {% endfor %}
除了显示我的模式中的键外,还将显示与记录关联的所有猫鼬元数据。我想了解为什么在 object 上循环时显示不同的信息。
$__ isNew errors _doc $__original_save save _pres _posts $__original_validate validate $__original_remove remove db discriminators __v id _id meta pain_points ideal_day environment basic_info updated_at created_at name_lower name schema collection $__handleSave $__save $__delta $__version increment $__where
我可以使用 Mongoose 的 lean()
解决这个问题,但仍然不明白为什么我会遇到这种情况。
当您调用 {{persona}}
时,结果为 persona.toString()
。
如果对象没有覆盖方法 toString
那么结果将是 [Object object]
(默认 toString
方法)。
当你使用循环时 {% for key, value in persona %}
那么它等于
for(var key in obj)
print(key + ' - ' + obj[key]);
此代码打印所有对象属性和方法。
要排除必须使用 next 循环的方法
for(var key in obj)
if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
print(key + ' ' + obj[key]);
因此,为了避免您的问题,您必须 "clear" 数据,然后再将其传递给 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 %}