【问题标题】:How to add parent name with their name using parent Id如何使用父 ID 添加父名称及其名称
【发布时间】:2018-02-02 14:24:51
【问题描述】:

我有以下数组保存在数据库中。我想修改它以显示如下,在 localeName 键中显示它们的层次结构。

var allLocales = [
{
    id: 123,
    localeName: 'Test',
    parentId: null
},
{
    id: 456,
    localeName: 'Test 1',
    parentId: 123
},
{
    id: 789,
    localeName: 'Test 2',
    parentId: 456
}
]

我想通过使用他们的父母改变他们的显示名称来将上面的数组更改为下面的数组。:

allLocales = [
{
    id: 123,
    localeName: 'Test',
    parentId: null
},
{
    id: 456,
    localeName: 'Test > Test 1',
    parentId: 123
},
{
    id: 789,
    localeName: 'Test > Test 1 > Test 2',
    parentId: 456
}
]

【问题讨论】:

    标签: node.js mongodb loopback


    【解决方案1】:

    如果您使用的是 mongo 3.4+,请尝试此聚合

    您可以使用$graphLookup 进行分层查询$graphLookup

    db.locales.aggregate(
        [
            {$graphLookup : {
                from : "locales",
                startWith : "$parentId",
                connectFromField : "parentId",
                connectToField : "id",
                as : "parents"
                }
            },
            {$addFields : {localeName : {$substr : [{$concat : [{$reduce : {input : "$parents", initialValue : "", in : {$concat : ["$$value", " > ", "$$this.localeName"]}}}, " > " ,"$localeName"] }, 3 , 1000]}}},
            {$project : {parents : 0}}
        ]
    ).pretty()
    

    收藏

    > db.locales.find()
    { "_id" : ObjectId("5a73dead0cfc59674782913a"), "id" : 123, "localeName" : "Test", "parentId" : null }
    { "_id" : ObjectId("5a73dead0cfc59674782913b"), "id" : 456, "localeName" : "Test 1", "parentId" : 123 }
    { "_id" : ObjectId("5a73dead0cfc59674782913c"), "id" : 789, "localeName" : "Test 2", "parentId" : 456 }
    > 
    

    结果

    > db.locales.aggregate( [ {$graphLookup : { from : "locales", startWith : "$parentId", connectFromField : "parentId", connectToField : "id", as : "parents" } }, {$addFields : {localeName : {$substr : [{$concat : [{$reduce : {input : "$parents", initialValue : "", in : {$concat : ["$$value", " > ", "$$this.localeName"]}}}, " > " ,"$localeName"] }, 3 , 100]}}}, {$project : {parents : 0}} ] ).pretty()
    {
        "_id" : ObjectId("5a73dead0cfc59674782913a"),
        "id" : 123,
        "localeName" : "Test",
        "parentId" : null
    }
    {
        "_id" : ObjectId("5a73dead0cfc59674782913b"),
        "id" : 456,
        "localeName" : "Test > Test 1",
        "parentId" : 123
    }
    {
        "_id" : ObjectId("5a73dead0cfc59674782913c"),
        "id" : 789,
        "localeName" : "Test > Test 1 > Test 2",
        "parentId" : 456
    }
    

    【讨论】:

      【解决方案2】:

      你需要做递归函数来解决这个问题。 我做了如下测试。 请看函数。

      var allLocales = [
        {  id: 123, localeName: 'Test', parentId: null },
        {  id: 456, localeName: 'Test 1',  parentId: 123 },
        {  id: 789, localeName: 'Test 2', parentId: 456 }
      ];
      
      
      function nameRecursion(element) {
          if(element.parentId == null) {
              return element.localeName
          }else {
              var parent = allLocales.find(item => item.id === element.parentId);
              return nameRecursion(parent) + " -> " + element.localeName;
          }
      }
      
      var newArray = allLocales.map(a => Object.assign({}, a));
      for(var i=0; i<allLocales.length; i++){
           newArray[i].localeName = nameRecursion(allLocales[i]);
      }
      
      console.log(allLocales);
      console.log(newArray);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        相关资源
        最近更新 更多