如何解决如何添加带有匹配文档的嵌入字段
我正在使用带有pymongo的Python从数据库查询。
我有3个不同的收藏集:
第一:
# Projects collection
{
"_id": "A",},{
"_id": "B",{
"_id": "C"
},..
第二:
# Episodes collection
{
"_id": "A/Episode01","project": "A","name": "Episode01"
},{
"_id": "A/Episode02","name": "Episode02"
},{
"_id": "B/Episode01","project": "B",..
第三名:
# Sequences collection
{
"_id": "A/Episode01/Sequence01","episode": "Episode01","name": "Sequence01"
},{
"_id": "A/Episode02/Sequence02","episode": "Episode02","name": "Sequence02"
},{
"_id": "B/Episode01/Sequence01",..
我想使用聚合查询项目A
并获取其所有对应的情节和序列,如下所示:
{
"_id": "A","episodes":
[
{
"_id": "A/Episode01","name": "Episode01","sequences":
[
{
"_id": "A/Episode01/Sequence01","name": "Sequence01"
},]
},{
"_id": "A/Episode02","name": "Episode02","sequences":
[
{
"_id": "A/Episode02/Sequence02","name": "Sequence02"
},]
}
我可以尽可能了解正确的情节,但是我不确定如何为任何匹配的序列添加一个embed字段。是否可以在单个管道查询中完成全部操作?
现在我的查询看起来像这样:
[
{"$match": {
"_id": "A"}
},{"$lookup": {
"from": "episodes","localField": "_id","foreignField": "project","as": "episodes"}
},{"$group": {
"_id": {
"_id": "$_id","episodes": "$episodes"}
}}
]
解决方法
您可以喜欢以下内容
- 使用
$match
来匹配文档 - 使用uncorrelated queries来加入两个集合。但是,正如您所写的,也可以进行正常的加入。当我们遇到一些复杂的情况时,这会更容易。
Mongo脚本在下面给出
[
{
"$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"
}
}
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。