gpt4 book ai didi

Mongodb图查找

转载 作者:行者123 更新时间:2023-12-01 08:51:24 27 4
gpt4 key购买 nike

由于 MongoDB 最近引入了 graphLookup,我试图找到它是否可以保存一个简单的社会关系图。我目前仅为此目的使用 neo4j。

我将 graphLookup 理解为递归搜索,它只是通过每个文档的“connectFromField”来更深入。

虽然我能够做基本的事情,但我想为每个关系提供更多的属性。例如,这里的第一个示例:(员工和报告层次结构)

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

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

如果我需要向 'reportsTo' 值添加开始日期,如下所示:
{ "_id" : 2, "name" : "Eliot", "reportsTo" : {"name": "Dev", "from": "date"  } }

恐怕这不受支持。

我想知道是否有人以这种方式使用过 MongoDB。

最佳答案

假设我们插入了以下文档:

> 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/

关于Mongodb图查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40989763/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com