好的伙伴就是这个。
我有一个包含3个集合的mongo数据库:
GeoPlaces通过父子关系(它是树)链接在一起。所以每个GeoPlace都有一个父级,除了那些位于树顶部的父级。
PoI有一个地理字段,其中包含一系列GeoPlaces引用(通过检查geoPlace.ParentId)。
我必须检查GeoPlaces的地理引用是否也形成一棵树。如果确实如此,我还必须检查该树是否是更一般的GeoPlaces树的子部分。
所以我要做的是获取mongo PoI集合的光标。迭代它然后映射地理数组的内容以获得它的geoPlace引用。
然后,我尝试通过创建一个函数getParent进行递归,该函数将geoPlace ID作为arg并在parentArr中返回其父级。
然后我以新的parentId参数递归返回相同的函数。所以它可以填充我的parentArr,直到我的链中没有更多的parentId定义(也就是我在树的顶部,没有更多的父级)。
以下是代码:
const getParents = (cp, geoRef, parentsArr, poiId, geoIndex) => {
let gpFromPOI = GeoPlaces.findOne({_id: geoRef});
gpFromPOI.then((gp) => {
if(gp){
if(parentsArr){
parentsArr.push(gp._id );
}
if(gp.ParentId){
if(parentsArr.indexOf(gp.ParentId) > -1){
parentsArr.push(gp.ParentId)
return cp;
}
return cp.then(() => {
return GeoPlaces.findOne({_id: gp.ParentId})
.then((parentId) => {
if(parentId && parentId.ParentId != null){
return getParents(cp, parentId.ParentId, parentsArr );
}
})
.catch((err) => {
console.error('Error promise : ', err)
})
})
} else {
return;
}
}
})
return cp;
}
const resolveParent = async (geoRef, poiId, geoIndex) => {
const parentsArr = [];
let cp = Q();
await getParents(cp, geoRef, parentsArr, poiId, geoIndex);
return parentsArr;
}
const getGeographyGenealogy = async () => {
let cursor = PoI.find({}).project({Geographies:1});
let deferred = Q.defer();
cursor.forEach((poi) => {
if (poi){
if (poi.Geographies){
poi.Geographies.map(async (geoRef, geoIndex) => {
let genealogy = await resolveParent(geoRef._id, poi._id, geoIndex);
});
}
}
}, (err) => {
if(err){
console.error('Error', err )
}
cursor.close().then(() => {
deferred.resolve();
})
})
return deferred.promise
.then(() => {
})
.catch(err => {
console.log('Err Promise : ', err)
})
}
await getGeographyGenealogy();
问题是我的parentArr只返回一个值。 即:
PoI谱系(5847e7451ab03b73fe07cebb)地理[2] ==> [595a5f73cac8c815d8947e5a]
'==>'之后的数组位置应该包含引用的id,父引用的id,父引用的父id的id等,直到没有更多的父。
有什么想法吗?
ps:geoPlace的输出:
{ _id: 58a47e1bacc9ab155c49b48f,
Version: null,
CreatedAt:
[ Long { _bsontype: 'Long', low_: -1943318939, high_: 148133309},0 ],
UpdatedAt:
[ Long { _bsontype: 'Long', low_: -1943318939, high_: 148133309},0 ],
Deleted: false,
Name: 'NORTH',
LevelId: 56fbcd970000000000000003,
ParentId: 58a47e1bacc9ab155c49b3etf,
Latitude: null,
Longitude: null,
CreatedBy: 'xxx',
UpdatedBy: 'xxx' }