如何通过mongoose中的单个键迭代多个值

我有一个使用MongoDB作为数据库的Web应用程序,我试图迭代通过一个单一的属性,护照内的多个值。

这是我的模式:

var EmployeeDBSchema = new Schema({ /* Passport tab schema */ passportInfo: { passportDetails: [] }, 

这就是Robomongo的外观:

在这里输入图像说明

我试着检查,如果这可以作为一个数组检索,所以我做了下面:

 console.log(_.map(results, _.property('passportInfo'))); passportArr = _.map(results, _.property('passportInfo')); console.log("is passport array? " + _.isArray(passportArr)); 

结果:

在这里输入图像说明

现在,因为它是积极的,我试着迭代通过它像一个正常的数组使用ff。 码:

  _.forEach(passportArr, function (value, key) { _.forEach(passportArr[key], function(value2, key2){ console.log(key2 + " >> " + value2); }); }); 

但是,我得到的是这样的:

在这里输入图像说明

我怎样才能得到passportExpiry,passportNumber和countryOfOrigin的值?

我真的很难过这个。 希望有人能帮助。

谢谢。

编辑:不知道这是否会帮助,但是,我从这个Plunker结构的想法。 护照背后的主要思想是用户可以添加无限数量的护照信息(因此passportInfo数组)。 我试图检索这里的数据,所以我可以呈现为一个CSV文件。

更新:这是根据请求(从console.log )扩展的results

 full results [ { _id: dummyiddontmind123, employeeID: '123asd12', desiredRoleOther: 'Other role', desiredRole3: 'Role 3', desiredRole2: 'Role 2', desiredRole1: 'The Role', isOpenToIntlAssignment: 'Y', employeeName: 'Jane Doe', yrsInIT: 1, visaInfo: [ { visaCountryOfOrigin: [Object], visaNumber: 'asd', visaEntry: 'Single', visaExpiry: '2017-03-16T16:00:00.000Z', visaStatus: 'expired' } ], passportInfo: [ { countryOfOrigin: [Object], passportNumber: [Object], passportExpiry: '2017-03-03' }, { countryOfOrigin: [Object], passportNumber: [Object], passportExpiry: '2017-03-08T16:00:00.000Z' }, { countryOfOrigin: [Object], passportNumber: [Object], passportExpiry: '2017-03-10T16:00:00.000Z' } ] } ] [ [ { passportExpiry: '2017-03-03', passportNumber: { '0': 'EB1234567' }, countryOfOrigin: { '0': 'Philippines' } }, { passportExpiry: '2017-03-08T16:00:00.000Z', passportNumber: { '1': 'AS1234' }, countryOfOrigin: { '1': 'Japan' } }, { passportExpiry: '2017-03-10T16:00:00.000Z', passportNumber: { '2': 'AX123' }, countryOfOrigin: { '2': 'Singapore' } } ] ] 

  1. passportInfo里面的数据有点不对,可能是由于输出后出现了一些复制粘贴错误。

  2. 我把它想要把所有存储的护照信息导出到格式country; number; expirycsv格式country; number; expiry country; number; expiry country; number; expiry


你要确定的第一件事是你所期望的实际数据和数据在结构上是相同的。 如果不是,则仍然可以在之前添加转换步骤(例如,将数组或变换对象从{0: 123}变换为[123] )。

一旦这个控制,你可以开始通过映射employee.passportInfo的对象从一个结构化的对象到你的csv所需的一系列信息。 这发生在Array.prototype.map

我在该映射中添加了另一个步骤,以确保将{0: 123}forms的passportInfo.passportNumber对象转换为数组[123] 。 这个数组然后通过添加passportInfo.countryOfOrigin.passportExpiry来映射到你的csv.passportExpiry

 // The following code snippets only operates on one employee. If you have an array use an iteration function depending on your needs. const employee = { _id: 123, employeeID: '123asd12', desiredRoleOther: 'Other role', desiredRole3: 'Role 3', desiredRole2: 'Role 2', desiredRole1: 'The Role', isOpenToIntlAssignment: 'Y', employeeName: 'Jane Doe', yrsInIT: 1, visaInfo: [ { visaCountryOfOrigin: [Object], visaNumber: 'asd', visaEntry: 'Single', visaExpiry: '2017-03-16T16:00:00.000Z', visaStatus: 'expired' } ], passportInfo: [ { countryOfOrigin: 'ABC', passportNumber: { 0: '123123123' }, passportExpiry: '2017-03-03' }, { countryOfOrigin: 'DEF', passportNumber: { 0: '321321321', 1: '123123123' }, passportExpiry: '2017-03-08T16:00:00.000Z' }, { countryOfOrigin: 'GHI', passportNumber: { 0: '654654654' }, passportExpiry: '2017-03-10T16:00:00.000Z' } ] }; const flattenPassportNumbers = numbers => Object.keys(numbers).map(key => numbers[key]); const info = employee.passportInfo.map(({passportNumber, passportExpiry, countryOfOrigin}) => flattenPassportNumbers(passportNumber).map(number => [countryOfOrigin, number, passportExpiry] ) ); const flattenLine = ([line]) => line; const joinLine = (line) => line.join('; '); const lines = info.map(flattenLine); console.log(lines.map(joinLine)); console.log(lines.map(joinLine).join('\n'));