mongoDB中的亲子关系

时间:2018-02-07 17:29:21

标签: node.js mongodb recursion promise parent-child

好的伙伴就是这个。

我有一个包含3个集合的mongo数据库:

  • GeoLevels
  • GeoPlaces
  • 兴趣点

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

0 个答案:

没有答案