2016-12-06 65 views
1

由於MongoDB最近引入了graphLookup,我試圖找出它是否可以容納一個簡單的社交關係圖。我目前使用neo4j只是爲了這個目的。Mongodb graphLookup

我明白graphLookup是一個遞歸搜索,它只是深入每個文檔的'connectFromField'。

儘管我能夠做基本的東西,我想給每個關係更多的屬性。例如,第一個例子在這裏:(員工和報告層次)

https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/

{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }

如果我需要一個開始日期添加到「上級」的值,這樣的事情:

{ "_id" : 2, "name" : "Eliot", "reportsTo" : {"name": "Dev", "from": "date" } }

恐怕這不被支持。

我想知道是否有人用這種方式使用了MongoDB。

回答

5

說,我們已經得到了以下文件插入:

> db.employees.insertMany([ 
... { "_id" : 1, "name" : "Dev" }, 
... { "_id" : 2, "name" : "Eliot", "reportsTo" : { name: "Dev", "from": ISODate("2016-01-01T00:00:00.000Z") } }, 
... { "_id" : 3, "name" : "Ron", "reportsTo" : { name: "Eliot", "from": ISODate("2016-01-01T00:00:00.000Z") } }, 
... { "_id" : 4, "name" : "Andrew", "reportsTo" : { name: "Eliot", "from": ISODate("2016-01-01T00:00:00.000Z") } }, 
... { "_id" : 5, "name" : "Asya", "reportsTo" : { name: "Ron", "from": ISODate("2016-01-01T00:00:00.000Z") } }, 
... { "_id" : 6, "name" : "Dan", "reportsTo" : { name: "Andrew", "from": ISODate("2016-01-01T00:00:00.000Z") } }, 
... ]); 
{ "acknowledged" : true, "insertedIds" : [ 1, 2, 3, 4, 5, 6 ] } 

然後,我們可以只使用.使用以下聚集查詢從一個嵌入文檔獲取一個字段:

db.employees.aggregate([ 
{ 
    $graphLookup: { 
     from: "employees", 
     startWith: "Eliot", 
     connectFromField: "reportsTo.name", 
     connectToField: "name", 
     as: "reportingHierarchy" 
    } 
} 
]) 

哪將返回給我們以下結果:

{ 
     "_id" : 1, 
     "name" : "Dev", 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 
{ 
     "_id" : 2, 
     "name" : "Eliot", 
     "reportsTo" : { 
       "name" : "Dev", 
       "from" : ISODate("2016-01-01T00:00:00Z") 
     }, 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 
{ 
     "_id" : 3, 
     "name" : "Ron", 
     "reportsTo" : { 
       "name" : "Eliot", 
       "from" : ISODate("2016-01-01T00:00:00Z") 
     }, 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 
{ 
     "_id" : 4, 
     "name" : "Andrew", 
     "reportsTo" : { 
       "name" : "Eliot", 
       "from" : ISODate("2016-01-01T00:00:00Z") 
     }, 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 
{ 
     "_id" : 5, 
     "name" : "Asya", 
     "reportsTo" : { 
       "name" : "Ron", 
       "from" : ISODate("2016-01-01T00:00:00Z") 
     }, 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 
{ 
     "_id" : 6, 
     "name" : "Dan", 
     "reportsTo" : { 
       "name" : "Andrew", 
       "from" : ISODate("2016-01-01T00:00:00Z") 
     }, 
     "reportingHierarchy" : [ 
       { 
         "_id" : 1, 
         "name" : "Dev" 
       }, 
       { 
         "_id" : 2, 
         "name" : "Eliot", 
         "reportsTo" : { 
           "name" : "Dev", 
           "from" : ISODate("2016-01-01T00:00:00Z") 
         } 
       } 
     ] 
} 

我們然後還可以使用聚合管道的其餘部分做任何其他操作:

db.employees.aggregate([ 

    { $match: { "reportsTo.from": { $gt: ISODate("2016-01-01T00:00:00Z") } } }, 
    { $graphLookup: { ... } }, 
    { $project: { ... } 
]); 

管道階段見https://docs.mongodb.com/v3.2/reference/operator/aggregation-pipeline/

+0

如何投影reportingHierarchy?如果我不想從reportHierarchy中的項目看到該怎麼辦?就我而言,文檔相當大,並有很多項目。 –

+0

@LuffyCyliu只需使用$ project管道將其投影到另一個模型中即可。 –