我有几个型号:
使用下面的代码,我已经能够使用country_code引用为PhoneModel播种,但是当我尝试将phone_ids推送到PersonModel之后,该数组始终为空。
我需要在下面的代码中更改以保留个人文档中的phone_ids吗?
import * as commonPhone from '../../_common/communication/phone.common.actions.api';
function seedDatabase() {
return new Promise((resolve, reject) => {
PersonModel.find({}, (errFind, collection) => {
if (errFind) {
console.log(`${PersonModel.modelName} Error: ${errFind.message}`);
reject(errFind);
}
if (collection.length === 0) {
data.map(person => {
const newPerson = Object.assign({phone_ids: []}, person);
person.phone_numbers.map(phone => {
// successfully seeded commonPhone collection
commonPhone.addNew(phone, (errPhone, newPhone) => {
if (errPhone) {
console.log(`${commonPhone.modelName} Error: ${errPhone.message}`);
reject(errPhone);
}
resolve(newPhone);
// newPerson does show newPhone.id added to array
newPerson.phone_ids.push(newPhone.id);
});
})
//////////////// PROBLEM IS HERE ////////////////
// the array for person's phone_ids is empty?!?!?!
console.log('PhoneIds: ' + JSON.stringify(newPerson.phone_ids));
});
}
});
});
}
答案 0 :(得分:0)
两天后想出这个。解决方案可能是独一无二的,但我认为这对参与映射 ES6承诺并处理从这些 ES6承诺派生的参考的猫鼬模型有帮助,所以我有对解决方案非常详细。
<强>予。场景:
1. PersonModel具有来自PhoneModel的集合phone_ids。
2. PhoneModel需要country_id并且有country_code。
3. CountryModel具有PhoneModel需要的country._id属性和country_code。
<强> II。简单部分:
在我的apx调用的redux操作中,这里是国家/地区获取方法和手机添加新方法。
<强>一个。国家行动......
import {CountryRefModel} from '../../../models/_repo.models.api';
module.exports {
.....
// need country name too, Canada/US/Carribean Is. have same country_code
getIdByCountryCode: (countryName, countryCode) => {
return new Promise((resolve, reject) => {
CountryRefModel.findOne({name: countryName, country_code: countryCode },
{_id: 1}, (err, result) => {
if (err) {
console.log(`${CountryModel.modelName} getIdByCountryCode Error: ${err.message}`);
reject(err);
}
resolve(result);
});
});
},
.....
}
<强>一个。电话行动......
import {PhoneModel} from '../../../models/_repo.models.api';
import * as refCountry from '../../_reference/country/country.reference.actions.api';
module.exports {
....
addNew: (phone) => {
return new Promise((resolve, reject) => {
refCountry.getIdByCountryCode(phone.country.name, phone.country.country_code)
// using then method as country action get method
// is already a promise
.then(returnValue => {
PhoneModel.create({
_id: phone.id,
country_id: returnValue,
type: phone.type,
isMain: phone.isMain ? phone.isMain : false,
area_code: phone.area_code,
prefix: phone.prefix,
suffix: phone.suffix,
vanity_number: phone.vanity_number ? phone.vanity_number : null
}, (err, result) => {
if (err) {
console.log(`${PersonModel.modelName} addNew Error: ${err.message}`);
reject(err);
}
resolve(result);
});
});
});
},
....
}
<强> II。冒险部分:
人员行动有种子,并为我需要做的添加新方法。
我需要通过人物映射,
通过手机映射,
一个。获取每部手机的country_id
湾将每部手机添加到手机集中
℃。将相应的phone._id传递给此人
- 醇>
在集合中添加新人。
<强>一个。人的行为....
让我花了一段时间才弄明白的困难部分是种子 方法
要考虑的要点:
将映射分配给变量。
由于手机动作的addNew除了添加新手机外还进行了CountryModel搜索,我只需要在映射中调用它的addNew方法。
- 使用相同的模块调用addNew方法 醇>
然后我通过module.exports.addNew&#39;
import mongoose from 'mongoose';
import {PersonModel} from '../../../models/_repo.models.api';
import {addNew} from '../../_common/communication/phone.common.actions.api';
const data = require('../../../seed/_common/people/person.seed.api.js').getData();
function seedDatabase() {
PersonModel.find({}, (errFind, collection) => {
if (errFind) {
console.log(`${PersonModel.modelName} Seed Error: ${errFind.message}`);
}
if (collection.length === 0) {
const updatedPerson = data.map(person => {
person.id = mongoose.Types.ObjectId();
const phoneIds = [];
const updatePhones = person.phone_numbers.map(phone => {
phone.id = mongoose.Types.ObjectId();
phoneIds.push(phone.id);
return addNew(phone);
});
return module.exports.addNew(person, phoneIds);
});
});
// Just an example of taking the promises further
// return LocationModel.addNew(person.id);
}
});
}
module.exports = {
seed: () => seedDatabase(),
....
addNew: (person, phoneIds) => {
return new Promise((resolve, reject) => {
person.phone_ids = (phoneIds);
PersonModel.create({
prefix: person.prefix,
fName: person.fName,
mName: person.mName,
lName: person.lName,
suffix: person.suffix,
profDes: person.profDes,
gender: person.gender,
email: person.email,
phone_ids: person.phone_ids,
lang_key: person.lang_key
}, (err, result) => {
if (err) {
console.log(`${PersonModel.modelName} addNew Error: ${err.message}`)
reject(err);
} else {
resolve(result);
}
})
})
},
....
}
与往常一样,文档中的所有内容都过于简化,并且在实际场景中并不十分清晰。希望这有助于人们!