MongoDB:在精确的深度找到人

MongoDB:在精确的深度找到人,mongodb,mongodb-query,Mongodb,Mongodb Query,我在MongoDB中有一种图形连接: { from: ObjectID(user), to: ObjectID(user) } 如果我想获得深度1的所有用户,很容易: db.connections.find({from:ObjectID(myUser)}); 但是,当我想在深度2查找所有用户时,这很难:愚蠢的想法是在深度1查找所有用户,然后像前一个一样为每个人执行查询。不可能,而且它还将返回所有循环路径 e.g 1->2 2->1 1->3 2-&

我在MongoDB中有一种图形连接:

{ 
    from: ObjectID(user),
    to: ObjectID(user) 
}
如果我想获得深度1的所有用户,很容易:

db.connections.find({from:ObjectID(myUser)});
但是,当我想在深度2查找所有用户时,这很难:愚蠢的想法是在深度1查找所有用户,然后像前一个一样为每个人执行查询。不可能,而且它还将返回所有循环路径

e.g 
1->2 
2->1 
1->3
2->4
results of user(1).findDepth2() would be 2,1,3,4 instead of 4. 
pseudo node.js中的示例:

var myFriends = db.connections.find({from:ObjectID(myUser)});
var friendAtDepth2 = [];
for(friend in myFriends){
    // I find friends of each friend
    var frendsOfFriend = db.connections.find({from:ObjectID(friend)});
    for(friendOfFriend in frendsOfFriend){
        if(friendAtDepth2.indexof(friendOfFriend)==-1 
             && myFriends.indexof(friendOfFriend)==-1
             && myUser!=friendOfFriend){
             // I haven't already found this user, so I it is actually at depth 2
             friendAtDepth2.push(friendOfFriend);
        }
    }
}
但是通过这种方式,我确实做了很多查询,我希望存在一种类似于mysql的连接查询,我只在一个查询中做这件事

这样的查询可行吗?

实现算法以查找距离特定节点2处的所有节点

它的线性时间复杂度为O | E |+| V |,因此你不可能做得比这更好

如果需要距离为2、3等的所有节点,则可能需要研究所有对最短路径算法,并对它们进行一些自定义

通过定制,我的意思是你应该从每个节点运行BFS,并在所需的深度停止。如果您想要一些具体的代码示例,您应该看看类似的问题,如

另外,根据您的数据,您可以将显式邻居列表添加到节点中,这些节点需要过多的空间,您可以通过一个查询将所有数据放入内存中,或者您可以尝试使用聚合框架,在那里实现它可能有点困难,但这应该是最快的解决方案


如果你的应用程序在图形和图形算法上很重,你应该考虑图形数据库,比如,

我想你确实需要给这个例子添加一个明确的例子。你的问题中没有显示任意深度的内容。意思是:如果你在深度2找到一个查询来查找人员,那么也可以在深度3或4找到一个查询,但仍然没有足够的信息。一个示例文档来说明是好的。失败的代码尝试更好。只是试着提出建议,因为人们会关闭这个。由你决定。也许你不必评论那些不能回答你问题的东西,你可以像被要求的那样集中精力更清楚地解释你的问题。你可以只浏览一次你的收藏:1。浏览收藏并构建1对1关系矩阵,无论是否对称,2。你把矩阵平方。这不是一个最佳的理论复杂度,但它是一个二进制矩阵,如果你考虑到查询执行时间,你可以节省很多时间…除非你要展示一些代码如何在这种情况下这样做,那么这不是一个答案。链接往往会随着时间的推移而改变,所以要么解释答案,要么接受你没有提供完整的答案。呼吸优先搜索算法非常有名,我只是提供了第一个谷歌点击。此外,该问题没有提供清晰的数据结构,因此我无法为该问题提供代码。这是一个理论上的答案。谷歌搜索也不是唯一的答案。您需要展示如何获得所需的结果。任何人都可以用谷歌搜索。除非你能展示如何做,否则最好作为评论。这就是答案。是的,这是众所周知的,但如何实现呢?正如我所说的,愚蠢的想法是在深度1中找到所有人,然后为每个人执行与前一个一样的查询。实际上,BFS的实现是不可能的,但它非常重要inefficient@rodi,也许我不够明确。在答案中检查我的编辑。