代码之家  ›  专栏  ›  技术社区  ›  Javid Asgarov

如何从MongoDB中递归获取数据?

  •  0
  • Javid Asgarov  · 技术社区  · 6 年前

    我在MongoDB中有一些数据(我们称之为日志),比如说:

    {
      name: String,
      category_id: String
    }
    

    每个类别都有 家长ID . 我想要的是尽可能地从树上获取第一个父级,并从所谓的日志中获取每个数据项的所有父级。

    我首先想到的是:在控制器中获取所有项目,然后递归地获取所有父类。这可能行得通,但似乎既单调又错误。

    对于模型本身,可能还有更好的事情要做,比如静态方法。

    所以,我的问题是,您如何处理MongoDB?我知道有聚合,我使用过几次,但如果按某个具有特定值的字段,我可以看到如何使用它们。但是在这里,你得到一个项目,通过它的父ID获得下一个项目,等等。

    1 回复  |  直到 6 年前
        1
  •  1
  •   matthPen    6 年前

    $graphLookup

    #logs collection
    db.logs.find({});
    { 
        "_id" : ObjectId("5b4f2970d42ef3178d108e86"), 
        "name" : "01", 
        "category" : "cat1"
    }
    { 
        "_id" : ObjectId("5b4f2981d42ef3178d108e87"), 
        "name" : "02", 
        "category" : "cat1"
    }
    { 
        "_id" : ObjectId("5b4f298ad42ef3178d108e88"), 
        "name" : "03", 
        "category" : "cat2"
    }
    { 
        "_id" : ObjectId("5b4f2997d42ef3178d108e89"), 
        "name" : "04", 
        "category" : "cat2"
    }
    { 
        "_id" : ObjectId("5b4f29bed42ef3178d108e8a"), 
        "name" : "015", 
        "category" : "cat10"
    }
    
    #categories collection
    db.categories.find({});
    { 
        "_id" : "cat1", 
        "parent_id" : "cat2"
    }
    { 
        "_id" : "cat2", 
        "parent_id" : "cat10"
    }
    { 
        "_id" : "cat10"
    }
    

    db.logs.aggregate(
        [
            {
                $graphLookup: {
                    from: "categories",
                    startWith: "$category", // connectToField value(s) that recursive search starts with
                    connectFromField: "parent_id",
                    connectToField: "_id",
                    as: "related_categories",
                    maxDepth: 10, // optional
                    depthField: "depthField" // optional - name of field in output documents
                }
            },
        ],
    );
    

    { 
        "_id" : ObjectId("5b4f2970d42ef3178d108e86"), 
        "name" : "01", 
        "category" : "cat1", 
        "related_categories" : [
            {
                "_id" : "cat10", 
                "depthField" : NumberLong(2)
            }, 
            {
                "_id" : "cat2", 
                "parent_id" : "cat10", 
                "depthField" : NumberLong(1)
            }, 
            {
                "_id" : "cat1", 
                "parent_id" : "cat2", 
                "depthField" : NumberLong(0)
            }
        ]
    }
    { 
        "_id" : ObjectId("5b4f2981d42ef3178d108e87"), 
        "name" : "02", 
        "category" : "cat1", 
        "related_categories" : [
            {
                "_id" : "cat10", 
                "depthField" : NumberLong(2)
            }, 
            {
                "_id" : "cat2", 
                "parent_id" : "cat10", 
                "depthField" : NumberLong(1)
            }, 
            {
                "_id" : "cat1", 
                "parent_id" : "cat2", 
                "depthField" : NumberLong(0)
            }
        ]
    }
    { 
        "_id" : ObjectId("5b4f298ad42ef3178d108e88"), 
        "name" : "03", 
        "category" : "cat2", 
        "related_categories" : [
            {
                "_id" : "cat10", 
                "depthField" : NumberLong(1)
            }, 
            {
                "_id" : "cat2", 
                "parent_id" : "cat10", 
                "depthField" : NumberLong(0)
            }
        ]
    }
    { 
        "_id" : ObjectId("5b4f2997d42ef3178d108e89"), 
        "name" : "04", 
        "category" : "cat2", 
        "related_categories" : [
            {
                "_id" : "cat10", 
                "depthField" : NumberLong(1)
            }, 
            {
                "_id" : "cat2", 
                "parent_id" : "cat10", 
                "depthField" : NumberLong(0)
            }
        ]
    }
    { 
        "_id" : ObjectId("5b4f29bed42ef3178d108e8a"), 
        "name" : "015", 
        "category" : "cat10", 
        "related_categories" : [
            {
                "_id" : "cat10", 
                "depthField" : NumberLong(0)
            }
        ]
    }