我在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 }
这表示这样的有向图:
有没有一种有效的方法从图表中删除“叶子”?在示例中,我想从图中删除节点4,因为该节点只有一个与节点3的链接并删除节点5,因为只有节点2链接到它。
或者用图形术语来说:只保留具有indegree的顶点> 1或outdegree> 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]
}