2017-11-30 25 views
0

私は2つのコレクションを持っています。 sources

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

connections

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

私はすべてのソースの接続のリストを取得するには$graphLookupをグラフトラバーサルを行うにしようとしています。これは私が持っているコードです:

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

これは、レコードを戻るが、私はそれが二つのレコード(0002および0003)を含める必要が予想される場合destinations配列は空です。私はさらに、トラバース中に確率を掛けて、0001 - > 0002 = 0.8と0001 - > 0003 = 0.48(0.8 * 0.6)となるようにしたいと思います。私は、ここで単純なものを紛失しているに違いありません。なぜなら、私はそれがどのように表示されているのか正確に従うことを試みたからです(https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/)。

答えて

2

以下のクエリを試すことができます。

$graphlookupが2つ必要です.1つは各ソースの接続用で、もう1つは接続ごとの確率を計算するためのものです。

$unwind$graphlookup各接続ごとにすべての確率を得る。

$reduce~$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

いい仕事です!しかし、これは実際のシナリオでは大きなデータセットでは機能しません。なぜなら、第1と第2の 'graphLookup'の間に実際には接続がないからです。したがって、異なるルーツから(例えば、私たちの場合 '0001'ではなく)より多くのパスがある場合、 '0003'これらのパスは第2の(逆の) 'graphLookup'でピックアップされ、最後に乗算されます。しかし、それを修正する方法がわからない... – dnickless

関連する問題