首先让我说 Mongo 不是 - 一个图形数据库。这通常意味着它不会是任何与图形相关的问题的首选。
您所要求的可以在 Mongo 中完成,但绝对不是有效的,因为它需要您多次迭代整个集合。如果您确实想使用它,我会附上代码示例,但我再次建议您重新考虑 db 选择、数据结构选择或您可以做的任何更改以使其更易于使用。
这里说的是代码,方法是首先$group 整个集合,以便我们可以迭代它。然后通过查看数组交集是否不为 0 开始将文档分组。
db.collection.aggregate([
{
$group: {
_id: null,
ents: {
$push: "$$ROOT"
}
}
},
{
$project: {
clusters: {
$reduce: {
input: "$ents",
initialValue: [],
in: {
$cond: [
{
$gt: [
{
$size: {
$filter: {
input: "$$value",
as: "val",
cond: {
$gt: [
{
$size: {
"$setIntersection": [
"$$val",
[
"$$this.ent1",
"$$this.ent2"
]
]
}
},
0
]
}
}
}
},
0
]
},
{
$map: {
input: "$$value",
as: "val",
in: {
$cond: [
{
$gt: [
{
$size: {
"$setIntersection": [
"$$val",
[
"$$this.ent1",
"$$this.ent2"
]
]
}
},
0
]
},
{
"$setUnion": [
"$$val",
[
"$$this.ent1",
"$$this.ent2"
]
]
},
"$$val"
]
}
}
},
{
"$concatArrays": [
"$$value",
[
[
"$$this.ent1",
"$$this.ent2"
]
]
]
}
]
}
}
}
}
}
])
Mongo Playground