2017-11-30 2 views
0

두 개의 모음이 있습니다. sources :

[ { "_id": "0001", "name": "John Doe" }, { "_id": "0002", "address": "123 Some Place" }, { "_id": "0003", "phone": "5555555555" } ]

connections : 나는 모든 소스 연결 목록을 가져올 수 $graphLookup와 그래프 탐색을 시도하고있어

[ { "_id": "0001.0002", "_from": "0001", "_to": "0002", "probability": 0.8 }, { "_id": "0002.0003", "_from": "0002", "_to": "0003", "probability": 0.6 } ]

. 이것은 내가 가지고있는 코드 :

db.sources.aggregate([ { $match: { '_id': '0001' } }, { $graphLookup: { from: 'connections', startWith: '_id', connectFromField: '_from', connectToField: '_to', maxDepth: 2, depthField: 'numConnections', as: 'destinations' } } ])

이 기록을 다시 반환하지만 나는 그것이 두 개의 레코드 (0002 및 0003)를 포함한다 기대할 때 destinations 배열이 비어 있습니다. 나는 또한 traversal 중에 0001 -> 0002 = 0.8 및 0001 -> 0003 = 0.48 (0.8 * 0.6)이되도록 확률을 배가하고 싶다. 내가 doucmentation (https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/)에서 표현되는 방법을 정확히 따르려고 했으므로 여기에 간단한 것을 놓치고 있어야합니다.

답변

2

아래의 쿼리를 사용해보십시오.

$graphlookup 두 개가 필요합니다. 각 소스에 대한 연결 용이고 하나는 각 연결에 대한 확률 계산 용입니다.

$unwind$graphlookup 각 연결에 대해 모든 확률을 얻으려면.

$reduce to $multiply 각 컬렉션의 모든 배열 요소.

$group 각 연결 및 가능성을 가진 소스 문서를 그룹화합니다.

db.sources.aggregate([ 
    { 
    "$match": { 
     "_id": "0001" 
    } 
    }, 
    { 
    "$graphLookup": { 
     "from": "connections", 
     "startWith": "$_id", 
     "connectFromField": "_to", 
     "connectToField": "_from", 
     "maxDepth": 2, 
     "depthField": "numConnections", 
     "as": "destinations" 
    } 
    }, 
    { 
    "$unwind": "$destinations" 
    }, 
    { 
    "$graphLookup": { 
     "from": "connections", 
     "startWith": "$destinations._to", 
     "connectFromField": "_from", 
     "connectToField": "_to", 
     "maxDepth": 2, 
     "as": "destinations.probabilities" 
    } 
    }, 
    { 
    "$addFields": { 
     "destinations.probabilities": { 
     "$reduce": { 
      "input": "$destinations.probabilities.probability", 
      "initialValue": 1, 
      "in": { 
      "$multiply": [ 
       "$$value", 
       "$$this" 
      ] 
      } 
     } 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": "$_id", 
     "name": { 
     "$first": "$name" 
     }, 
     "destinations": { 
     "$push": "$destinations" 
     } 
    } 
    } 
]) 
+0

안녕 Veeram, 내 mongo stackoverflow 문제를 살펴볼 수 있습니까? 나는 전문적인 눈이 필요해. [mongo issue] (https://stackoverflow.com/questions/47669390/advanced-mongodb-query-needed) – ChrisWorks

+0

좋은 직장! 그러나 더 큰 데이터 세트가있는 실제 시나리오에서는 작동하지 않습니다. 첫 번째와 두 번째'graphLookup '사이에는 연결이 없다는 것입니다. 그래서 다른 뿌리 (예 : '0001'이 아닌 경우)에서 더 많은 경로가 있다면 '0003'그러면 그 경로는 두 번째 (역방향)'graphLookup'에서 선택되어 결국 곱셈으로 끝납니다. 그래도 문제를 해결하는 방법을 모르겠다. – dnickless

관련 문제