无法从Mongoose访问populate()的d对象的属性?

这是非常奇怪的…我使用填充()与ref填充我的架构中的数组,但然后属性是无法访问。 换句话说,模式是这样的:

new Model('User',{ 'name': String, 'installations': [ {type: String, ref: 'Installations'} ], 'count': Number, } 

当然,Insallations是另一种模式。

然后我find并填充一组用户…

 model.find({count: 0}).populate('installations').exec( function(e, d){ for(var k in d) { var user = d[k]; for(var i in user.installations) { console.log(user.installations[i]); } } } ); 

到现在为止还挺好! 我看到好的数据打印出来,像这样:

 { runs: 49, hardware: 'macbookpro10,1/x86_64', mode: 'debug', version: '0.1' } 

但是,如果我试图实际访问任何这些属性,它们都是未定义的! 例如,如果我添加另一个控制台日志:

 console.log(user.installations[i].mode); 

然后我看到为这个日志打印“未定义”。 如果我试图在对象上操作,像这样:

  Object.keys(user.installations[i]).forEach(function(key) { } ); 

然后我得到一个典型的“[TypeError:Object.keys调用非对象]”错误,指示user.installations [i]不是一个对象(即使它被输出到控制台,就好像它)。 所以,我甚至尝试了一些丑陋的…

 var install = JSON.parse(JSON.stringify(user.installations[i])); console.log(install, install.mode); 

再次,第一个输出(安装)是一个很好的对象包含属性“模式”…但第二个输出是未定义的。

是什么赋予了?

最后,我解决了这个…

我试着做一个console.log(typeof user.installations [i]); 并得到“string”作为输出。 这似乎很奇怪,因为打印对象直接创build控制台输出(上图),看起来像一个普通的对象,而不是一个string。 所以,我试着做一个JSON.parse(); 上的对象,但收到错误“SyntaxError:意外的令牌r”

最后,我意识到发生了什么事情。 我上面描述的“漂亮的控制台输出”是用\ n(换行符)格式化的string的结果。 没有预料到,无论出于何种原因。 JSON.parse()错误是由于这样一个事实,即当试图parsing不带引号的对象键时,有一个已知的node.jsparsing器的必要性; 在这里看到SO问题: 为什么JSON.parse('{“key”:“value”}')做得不错,但JSON.parse('{key:“value”}“)不? 。

具体来说,请注意,在我的情况下,JSONparsing器是失败的字符'r',“运行”的第一个字符,这是我的JSONstring(上面)中的第一个键。 起初,我担心我需要一个自定义的JSONparsing器,但是这个问题打击了我。

回顾我的原始模式。 我使用了Stringtypes来定义安装引用,因为数组字段将安装的_id属性存储为string。 我假设.populate()字段将对象转换为输出上的string。

最后,我仔细看了看Mongoose文档,意识到我应该引用基于Schema.ObjectID的对象。 这解释了一切,但肯定给了我一些修改,在我的模式和代码在其他地方做…