我有一个Web应用程序,它使用MongoDB作为数据库,并且我试图遍历单个名为护照的属性中的多个值。

这是我的架构:

var EmployeeDBSchema = new Schema({

    /* Passport tab schema */
    passportInfo: {
        passportDetails: []
    },


这是Robomongo的外观:

javascript - 如何在 Mongoose 的单个键中通过多个值进行迭代-LMLPHP

我尝试检查是否可以将其检索为数组,所以我做了以下工作:

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


结果:

javascript - 如何在 Mongoose 的单个键中通过多个值进行迭代-LMLPHP

现在,由于它是肯定的,因此我尝试使用ff像普通数组一样对其进行迭代。码:

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


但是,我得到的是:

javascript - 如何在 Mongoose 的单个键中通过多个值进行迭代-LMLPHP

我如何获得passportExpiry,passportNumberNumber和countryOfOrigin的值?

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

谢谢。

编辑:不确定这是否有帮助,但是,我从this Plunker获得了结构的想法。 Passport背后的主要思想是用户可以添加无限数量的护照信息(因此passportInfo数组)。我正在尝试在此处检索数据,以便可以将其呈现为CSV文件。

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

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' } } ] ]

最佳答案

passportInfo中的数据有些错误,可能是由于输出后出现一些复制粘贴错误。
我认为您想将所有存储的护照信息导出为格式为csvcountry; number; expiry




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

一旦得到控制,就可以从将employee.passportInfo的对象从结构化对象映射到csv所需的信息数组开始。使用Array.prototype.map会发生这种情况。

我在该映射中添加了另一步,以确保将passportInfo.passportNumber形式的{0: 123}对象转换为数组[123]。然后,通过添加csvpassportInfo.countryOfOrigin将此数组用于映射到.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'));





如果您不了解某些内容,请随时询问。

07-24 15:26