복붙노트

[MONGODB] MongoDB를 $ graphLookup 깊은 아이들에게 모든 수준을 얻을 - 중첩 된 결과를

MONGODB

MongoDB를 $ graphLookup 깊은 아이들에게 모든 수준을 얻을 - 중첩 된 결과를

https://www.slideshare.net/mongodb/webinar-working-with-graph-data-in-mongodb에 제시된 바와 같이, 슬라이드 (50)는 2 개 수준 깊은 나무를 얻기 위해 뷰에 $ graphLookup를 사용할 수있다 중첩 된 형식으로 -structure.

나는 다음과 같은 형식의 문서와 같은 트리 노드와 MongoDB를 수집있다 :

{ "_id" : { "$oid" : "5b1a952361c6fa3418a15660" }, 
"nodeId" : 23978995, 
"name" : "settings", 
"type" : "Node",
"parentId" : [ 23978893, 23979072, 23979081 ] }

내가보기 등을 만들었습니다 :

db.createView("treeView", "node", [
{
 $graphLookup: {
    from: "node",
    startWith: "$nodeId",
    connectFromField: "nodeId",
    connectToField: "parentId",
    maxDepth: 0,
    as: "children"
 }
}
]);

그리고 그래프 조회를 같이 실행합니다 :

db.node.aggregate([ 
{ $match: {"nodeId": 23978786 } },
{
 $graphLookup: {
    from: "treeView",
    startWith: "$nodeId",
    connectFromField: "nodeId",
    connectToField: "parentId",
    maxDepth: 0,
    as: "children"
 }
}
]);

내 질문은 내가 깊이, 모든 수준을 전체 계층 구조를 얻을 수있는 방법인가?

해결법

  1. ==============================

    1.불행하게도, 당신은 중첩 된 형식의 전체 깊이를 얻을 수 없습니다. 뷰를 사용하면이 작업을 수행하지만, 당신은 당신이 필요 내장의 각 수준에 대한 새로운보기를 만들어야 할 수있는 해결 방법입니다. 대신에, 나는 루트 수준에서 시작하여, 깊이를 제공하는 응용 프로그램 수준에서 트리를 계산하기 전에, 하나의 쿼리에서 모든 계층 구조를 가져 오는없이 graphLookup을 수행하는 것이 좋습니다 것입니다.

    불행하게도, 당신은 중첩 된 형식의 전체 깊이를 얻을 수 없습니다. 뷰를 사용하면이 작업을 수행하지만, 당신은 당신이 필요 내장의 각 수준에 대한 새로운보기를 만들어야 할 수있는 해결 방법입니다. 대신에, 나는 루트 수준에서 시작하여, 깊이를 제공하는 응용 프로그램 수준에서 트리를 계산하기 전에, 하나의 쿼리에서 모든 계층 구조를 가져 오는없이 graphLookup을 수행하는 것이 좋습니다 것입니다.

    이것은이 같은과 같을 것이다 :

    db.node.aggregate([
        { $match: {
            parentId: null
        }},
        { $graphLookup: {
            from: "node",
            startWith: "$nodeId",
            connectFromField: "nodeId",
            connectToField: "parentId",
            depthField: "depth",
            as: "children"
        }}
    ]);
    

    이것은 당신이 "아이들"배열에있을 것이다 정보에서, 응용 프로그램에서 트리를 계산해야합니다, 당신이 그렇게 다음, 한 번에 전체 계층 구조를 가져올 수 있도록해야한다.

  2. ==============================

    2.@kmandalas 내가 지난 이일에서 문제의이 종류에 직면하고있어, (내가 그렇게 대답의 참조를 사용) 내 컬렉션은 약간의 차이가 있지만 개념은 당신이 결과를 얻는 데 도움이 될 것입니다 쓴 당신의 I 희망과 동일

    @kmandalas 내가 지난 이일에서 문제의이 종류에 직면하고있어, (내가 그렇게 대답의 참조를 사용) 내 컬렉션은 약간의 차이가 있지만 개념은 당신이 결과를 얻는 데 도움이 될 것입니다 쓴 당신의 I 희망과 동일

    내 컬렉션 스키마 같다 : CONST 종류는 새로운 스키마 ({=     sTitle는 {유형 : 문자열, 트림 : 사실을}     iParentId : {유형 : mongoose.Schema.Types.ObjectId, REF : '범주'}     bStatus : {유형 : 부울, 기본값 : TRUE},     dUpdatedAt : {유형 : 날짜}     dCreatedAt : {유형 : 날짜, 기본 : Date.now} });

    내가 좋아하는 하나의 적절한 부모에 모든 아이를 가지고보다 먼저, 나는 graphLookup $를 사용합니다 :

    {   "_id": "5c6fa228c30bbf02cf12fe6c를"    "sTitle": "firstParent"    "아이들": [{(OBJ)}, {(OBJ)}, {(OBJ)}, {(OBJ)}] // 어린이뿐만 아니라 손자 }, {   "_id": "5c80d644ab57dd06d48cc474"    "sTitle": "secondParent"    [] // 자식 : "어린이" }, .....

    이런 종류의 결과를 얻고 난 후에 나는 제 3 자 lib 디렉토리를 사용하지 않고 노드 JS 트리를 만들 수 있습니다. 트리 로직 코드는 :( 주 :! 워드 프로세서 다른 $ graphlooup 출력 아무것도 아니다)

    함수 list_to_tree (리스트) {             VAR 맵} = {노드 뿌리 = [], I;             대 (나는 <크고 List.length; 나는 0 = 1 + 1 =) {                 난 = [I]를 ._ ID가 목록]지도;                 리스트 [I] .children = [];             }             대 (나는 <크고 List.length; 나는 0 = 1 + 1 =) {                 노드 목록 = [I];                 경우 (node.iParentId! && == 널 맵 [node.iParentId!] == 미정) {                     VAR 노드 2 = {// 난 단지 _id 필요가 있기 때문에, 제목 및 어린이                         _id : node._id,                         제목 : node.sTitle,                         어린이 : node.children                     }                     리스트 [맵 [node.iParentId] children.push (노드 2).; // 당신은 직접 "노드"를 밀어 수 있습니다                 } 다른 {                     VAR 노드 2 = {                         _id : node._id,                         제목 : node.sTitle,                         어린이 : node.children                     }                     roots.push (노드 2);                 }             }             뿌리를 반환;         }         하자 final_result = [] // 차일 모든 부모를 저장하기위한         경우 (docs.length> = 0) {             docs.map (single_doc => {// 모든 부모 트리를 얻기 위해                 VAR single_child = list_to_tree (single_doc.children)                 VAR OBJ = {                     _id : single_doc._id,                     제목 : single_doc.sTitle,                     어린이 : single_child                 }                 final_result.push (OBJ)             })         }         을 console.log ( "최종 트리입니다", final_result)

    나는 당신을 도울 것입니다 희망

  3. from https://stackoverflow.com/questions/50767930/mongodb-graphlookup-get-children-all-levels-deep-nested-result by cc-by-sa and MIT license