从图表中删除所有叶子

时间:2013-11-05 14:23:58

标签: mongodb

我在MongoDB集合中构建了一个关系图,例如:

{ "user_id": 1, "follower_id": 2 }
{ "user_id": 1, "follower_id": 3 }
{ "user_id": 2, "follower_id": 1 }
{ "user_id": 2, "follower_id": 3 }
{ "user_id": 3, "follower_id": 4 }
{ "user_id": 5, "follower_id": 2 }

这表示这样的有向图:

enter image description here

有没有一种有效的方法从图表中删除“叶子”?在示例中,我想从图中删除节点4,因为该节点只有一个与节点3的链接并删除节点5,因为只有节点2链接到它。

或者用图形术语来说:只保留具有indegree的顶点> 1或outdegree> 1

1 个答案:

答案 0 :(得分:3)

简短的回答是否定的 - 没有有效的方法可以用这样的模式做你想做的事。它可以通过遍历所有节点,例如使用聚合框架,并将节点作为单独的操作删除,但我认为这是可以完成的任务。假设节点在graph集合中,它可能类似于下面但它远非有效:

db.graph.aggregate(
        {$project: {index: {$const: [0, 1]}, user_id: 1, follower_id: 1}},
        {$unwind: "$index"},
        {$project: {id: {$cond: [{$eq: ["$index", 0 ]}, "$user_id", "$follower_id"]} }},
        {$group: {_id: "$id", count: {$sum: 1}}},
        {$match: {count: {$lte: 1}}}
).result.forEach(function(node) { db.graph.remove({user_id: node._id});})

如果您希望此类操作有效,则可以使用更多类似文档的架构。

{
    user_id: 1,
    follows: [2, 3],
    followed_by: [2]
}