Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何添加包含匹配文档的嵌入字段_Mongodb_Aggregation Framework_Pymongo - Fatal编程技术网

Mongodb 如何添加包含匹配文档的嵌入字段

Mongodb 如何添加包含匹配文档的嵌入字段,mongodb,aggregation-framework,pymongo,Mongodb,Aggregation Framework,Pymongo,我使用Python和pymongo从数据库中进行查询 我有3个不同的收藏: 第一: 第二: 第三: 我想使用aggregate查询projectA,并获得其所有对应的剧集和序列,如下所示: { "_id": "A", "episodes": [ { "_id": "A/Episode01", "pr

我使用Python和pymongo从数据库中进行查询

我有3个不同的收藏:

第一:

第二:

第三:

我想使用aggregate查询project
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
    匹配文档
  • 用于加入两个集合。但是,正如您所写,正常连接也是可能的。当我们遇到一些复杂的情况时,这会更容易
  • 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"
          }
        }
      }
    ]
    

    工作

    你可以像下面这样做

  • 使用
    $match
    匹配文档
  • 用于加入两个集合。但是,正如您所写,正常连接也是可能的。当我们遇到一些复杂的情况时,这会更容易
  • 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"
          }
        }
      }
    ]
    

    工作

    我认为我的mongo版本不支持
    进入查找,因为我在3.2.3上。现在这给了我一个错误
    $lookup必须是字符串,让:{id:$\u id}是类型3
    Ohh。好的,那么我们将有更多关于标准查找的工作。我会这样做,让你知道哇,这似乎是工作,它觉得更可读比我的新版本。我看到的一个问题是,它看起来像是只按集名查找序列。可能有其他项目使用相同的名称,因此是否可以将其与插曲和项目匹配以防止获取错误的条目?不,除非使用不相关查找,否则没有办法。你能做的是,只需匹配并删除另一个阶段就可以了。在另一个阶段上使用
    $filter
    可以删除任何冲突的条目吗?我想我的mongo版本不支持
    查找,因为我在3.2.3上。现在这给了我一个错误
    $lookup必须是字符串,让:{id:$\u id}是类型3
    Ohh。好的,那么我们将有更多关于标准查找的工作。我会这样做,让你知道哇,这似乎是工作,它觉得更可读比我的新版本。我看到的一个问题是,它看起来像是只按集名查找序列。可能有其他项目使用相同的名称,因此是否可以将其与插曲和项目匹配以防止获取错误的条目?不,除非使用不相关查找,否则没有办法。您可以做的是,只需匹配并删除另一个阶段就可以在另一个阶段上使用
    $filter
    删除任何冲突条目吗?