Mongodb 如何添加包含匹配文档的嵌入字段
我使用Python和pymongo从数据库中进行查询 我有3个不同的收藏: 第一: 第二: 第三: 我想使用aggregate查询projectMongodb 如何添加包含匹配文档的嵌入字段,mongodb,aggregation-framework,pymongo,Mongodb,Aggregation Framework,Pymongo,我使用Python和pymongo从数据库中进行查询 我有3个不同的收藏: 第一: 第二: 第三: 我想使用aggregate查询projectA,并获得其所有对应的剧集和序列,如下所示: { "_id": "A", "episodes": [ { "_id": "A/Episode01", "pr
A
,并获得其所有对应的剧集和序列,如下所示:
{
"_id": "A",
"episodes":
[
{
"_id": "A/Episode01",
"project": "A",
"name": "Episode01",
"sequences":
[
{
"_id": "A/Episode01/Sequence01",
"project": "A",
"episode": "Episode01",
"name": "Sequence01"
},
]
},
{
"_id": "A/Episode02",
"project": "A",
"name": "Episode02",
"sequences":
[
{
"_id": "A/Episode02/Sequence02",
"project": "A",
"episode": "Episode02",
"name": "Sequence02"
},
]
},
]
}
[
{"$match": {
"_id": "A"}
},
{"$lookup": {
"from": "episodes",
"localField": "_id",
"foreignField": "project",
"as": "episodes"}
},
{"$group": {
"_id": {
"_id": "$_id",
"episodes": "$episodes"}
}}
]
我可以尽可能地获得正确的剧集,但我不确定如何为任何匹配的序列添加嵌入字段。是否可以在单个管道查询中完成这一切
现在,我的查询如下所示:
{
"_id": "A",
"episodes":
[
{
"_id": "A/Episode01",
"project": "A",
"name": "Episode01",
"sequences":
[
{
"_id": "A/Episode01/Sequence01",
"project": "A",
"episode": "Episode01",
"name": "Sequence01"
},
]
},
{
"_id": "A/Episode02",
"project": "A",
"name": "Episode02",
"sequences":
[
{
"_id": "A/Episode02/Sequence02",
"project": "A",
"episode": "Episode02",
"name": "Sequence02"
},
]
},
]
}
[
{"$match": {
"_id": "A"}
},
{"$lookup": {
"from": "episodes",
"localField": "_id",
"foreignField": "project",
"as": "episodes"}
},
{"$group": {
"_id": {
"_id": "$_id",
"episodes": "$episodes"}
}}
]
你可以像下面这样做
$match
匹配文档[
{
"$match": {
"_id": "A"
}
},
{
$lookup: {
from: "Episodes",
let: {
id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$project",
"$$id"
]
}
}
},
{
$lookup: {
from: "Sequences",
let: {
epi: "$name"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$episode",
"$$epi"
]
}
}
}
],
as: "sequences"
}
}
],
as: "episodes"
}
}
]
工作
更新01 使用标准查找
[
{
"$match": {
"_id": "A"
}
},
{
"$lookup": {
"from": "Episodes",
"localField": "_id",
"foreignField": "project",
"as": "episodes"
}
},
{
$unwind: "$episodes"
},
{
"$lookup": {
"from": "Sequences",
"localField": "episodes.name",
"foreignField": "episode",
"as": "episodes.sequences"
}
},
{
$group: {
_id: "$episodes._id",
episodes: {
$addToSet: "$episodes"
}
}
}
]
工作你可以像下面这样做
$match
匹配文档[
{
"$match": {
"_id": "A"
}
},
{
$lookup: {
from: "Episodes",
let: {
id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$project",
"$$id"
]
}
}
},
{
$lookup: {
from: "Sequences",
let: {
epi: "$name"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$episode",
"$$epi"
]
}
}
}
],
as: "sequences"
}
}
],
as: "episodes"
}
}
]
工作
更新01 使用标准查找
[
{
"$match": {
"_id": "A"
}
},
{
"$lookup": {
"from": "Episodes",
"localField": "_id",
"foreignField": "project",
"as": "episodes"
}
},
{
$unwind: "$episodes"
},
{
"$lookup": {
"from": "Sequences",
"localField": "episodes.name",
"foreignField": "episode",
"as": "episodes.sequences"
}
},
{
$group: {
_id: "$episodes._id",
episodes: {
$addToSet: "$episodes"
}
}
}
]
工作我认为我的mongo版本不支持
让
进入查找,因为我在3.2.3上。现在这给了我一个错误$lookup必须是字符串,让:{id:$\u id}是类型3
Ohh。好的,那么我们将有更多关于标准查找的工作。我会这样做,让你知道哇,这似乎是工作,它觉得更可读比我的新版本。我看到的一个问题是,它看起来像是只按集名查找序列。可能有其他项目使用相同的名称,因此是否可以将其与插曲和项目匹配以防止获取错误的条目?不,除非使用不相关查找,否则没有办法。你能做的是,只需匹配并删除另一个阶段就可以了。在另一个阶段上使用$filter
可以删除任何冲突的条目吗?我想我的mongo版本不支持让查找,因为我在3.2.3上。现在这给了我一个错误$lookup必须是字符串,让:{id:$\u id}是类型3
Ohh。好的,那么我们将有更多关于标准查找的工作。我会这样做,让你知道哇,这似乎是工作,它觉得更可读比我的新版本。我看到的一个问题是,它看起来像是只按集名查找序列。可能有其他项目使用相同的名称,因此是否可以将其与插曲和项目匹配以防止获取错误的条目?不,除非使用不相关查找,否则没有办法。您可以做的是,只需匹配并删除另一个阶段就可以在另一个阶段上使用$filter
删除任何冲突条目吗?