创建视图,通过串联聚合 3 个集合

问题描述 投票:0回答:1

我有3个收藏。我想创建一个视图来告诉我图像集合的图像文件是否用于另一个集合。

图片

        "_id": "65018e77b4f945eb41faff44",
        "fileName": "file01.webp",
        "size": "66K",
        "createdDate": 1694600823,
        "updatedDate": 1694600823,
        "deleted": "",
        "sizeNumber": 67340

杂志

{
        "_id": "64fb1db918be726025f1fb9e",
        "title": "LES FEUILLES MORTES",
        "imageVertical": "/assets/uploads/file04.webp",
        "affiche": "/assets/uploads/file46.webp",
        "teaserImages": [
            "/assets/uploads/file32.webp",
            "/assets/uploads/file45.webp",
            "/assets/uploads/file12.webp"
        ],
        "releaseDate": 1694178264.818,
        "subtitle": "« Le génie d'Aki Kaurismäki est de savoir trenscender un univers sinistre avec un humour succulent et une poésie incomparable. »",
        "createdDate": 1694178745,
        "updatedDate": 1694179009,
        "deleted": "",
        "validated": true
    }

电影


    {
        "_id": "6489f0c118be726025f1ee35",
        "category": "red",
        "title": "Interdit aux chiens et aux Italiens",
        "image": "/assets/uploads/file11.webp",
        "imageCard": "/assets/uploads/file24.webp",
        "director": "Alain Ughetto",
        "distributor": "Gebeka",
        "releaseDate": 1674601200,
        "videoLink": "https://player.vimeo.com/video/515151515845",
        "videoDlLink": "https://joon.doe",
        "imagesDlLink": "",
        "pressKitDlLink": "https://joon.doe",
        "createdDate": 1686761665,
        "updatedDate": 1686761959,
        "deleted": "",
        "validated": true,
        "__v": 0
    }

一个方便的输出是:

[
  {
    "_id": "65018e77b4f945eb41faff44",
    "fileName": "file01.webp",
    "size": "66K",
    "createdDate": 1694600823,
    "updatedDate": 1694600823,
    "deleted": "",
    "sizeNumber": 67340,
    "used": {
      "movies": {
        "_id": "74118e77b4f945eb41faff24",
        "imageCard": "/assets/uploads/file01.webp"
      }
    }
  },
  {
    "_id": "65018e77b4f945eb41faff44",
    "fileName": "file32.webp",
    "size": "66K",
    "createdDate": 1694600823,
    "updatedDate": 1694600823,
    "deleted": "",
    "sizeNumber": 67340,
    "used": {
      "mags": {
        "_id": "21218e77b4f945eb41faff54",
        "imageVertical": "/assets/uploads/file32.webp"
      }
    }
  }
]

我无法让它工作......我不知道我是否在某个时候搞砸了串联

{ "$concat": ["/assets/uploads/", "$fileName"] } }
但我没有设法获得任何像样的输出

我的尝试之一是希望有一种方法可以通过几个参数连接 2 个集合:

db.images.aggregate([
  {
    $lookup: {
      from: "mags",
      let: { fileNameWithPrefix: { $concat: ["/assets/uploads/", "$fileName"] } },
      pipeline: [
        {
          $match: {
            $expr: {
              $or: [
                { $eq: ["$imageVertical", "$$fileNameWithPrefix"] },
                { $eq: ["$imageHorizontal", "$$fileNameWithPrefix"] },
                { $eq: ["$affiche", "$$fileNameWithPrefix"] }
              ]
            }
          }
        },
        {
          $project: {
            _id: 1,
            fileName: 1,
            size: 1,
            createdDate: 1,
            updatedDate: 1,
            deleted: 1,
            sizeNumber: 1,
            fileNameWithPrefix: 1,
            affiche: 1,
            imageHorizontal: 1,
            imageVertical: 1
          }
        }
      ],
      as: "joinedData"
    }
  },
  {
    $unwind: "$joinedData"
  },
  {
    $project: {
      _id: 1,
      idMag: "$joinedData._id",
      imageHorizontal: "$joinedData.imageHorizontal",
      imageVertical: "$joinedData.imageVertical",
      affiche: "$joinedData.affiche",
      fileName: 1,
      size: "$joinedData.size",
      createdDate: "$joinedData.createdDate",
      updatedDate: "$joinedData.updatedDate",
      deleted: "$joinedData.deleted",
      sizeNumber: "$joinedData.sizeNumber"
    }
  }
]);

这是输出:

[{
        "_id": "65018e77b4f945eb41fafde5",
        "fileName": "file08.webp",
        "idMag": "6475eefaa801c7bf4f5b8ee3",
        "imageVertical": "/assets/uploads/file31.webp",
        "affiche": "/assets/uploads/file08.webp",
        "createdDate": 1685450490,
        "updatedDate": 1685450490,
        "deleted": ""
    },
    {
        "_id": "65018e77b4f945eb41fafdff",
        "fileName": "file12.webp",
        "idMag": "6475f502a801c7bf4f5b8f15",
        "imageVertical": "/assets/uploads/file12.webp",
        "affiche": "/assets/uploads/file86.webp",
        "createdDate": 1685452034,
        "updatedDate": 1685549150,
        "deleted": ""
    }]

这个输出还不错,我仍然尝试找到一种方法从值“teaserImages”的 mags 集合的数组中获取匹配项

我试过这个:

db.images.aggregate([
  {
    $lookup: {
      from: "mags",
      let: { fileNameWithPrefix: { $concat: ["/assets/uploads/", "$fileName"] } },
      pipeline: [
        {
          $match: {
            $expr: {
              $or: [
                { $eq: ["$imageVertical", "$$fileNameWithPrefix"] },
                { $eq: ["$imageHorizontal", "$$fileNameWithPrefix"] },
                { $eq: ["$affiche", "$$fileNameWithPrefix"] },
                {$in: ["$$fileNameWithPrefix", "$teaserImages"]}
              ]
            }
          }
        },
        {
          $project: {
            _id: 1,
            fileName: 1,
            size: 1,
            createdDate: 1,
            updatedDate: 1,
            deleted: 1,
            sizeNumber: 1,
            fileNameWithPrefix: 1,
            affiche: 1,
            imageHorizontal: 1,
            imageVertical: 1
          }
        }
      ],
      as: "joinedData"
    }
  },
  {
    $unwind: "$joinedData"
  },
  {
    $project: {
      _id: 1,
      idMag: "$joinedData._id",
      imageHorizontal: "$joinedData.imageHorizontal",
      imageVertical: "$joinedData.imageVertical",
      affiche: "$joinedData.affiche",
      fileName: 1,
      size: "$joinedData.size",
      createdDate: "$joinedData.createdDate",
      updatedDate: "$joinedData.updatedDate",
      deleted: "$joinedData.deleted",
      sizeNumber: "$joinedData.sizeNumber"
    }
  }
]);

这是输出:

{
    "message" : "PlanExecutor error during aggregation :: caused by :: $in requires an array as a second argument, found: missing",
    "ok" : 0,
    "code" : 40081,
    "codeName" : "Location40081"
}
mongodb view aggregate-functions mongodb-lookup
1个回答
0
投票

我的最后一次尝试很好地聚合了 2 个集合。 我将使用 2 个查询,然后将 2 个结果连接起来以获得 3 个集合聚合。

我遇到的最后一个错误是“聚合期间的 PlanExecutor 错误 :: 引起的 :: $in 需要一个数组作为第二个参数,发现:丢失”只是因为由于某种原因,有一些测试用例中缺少数组该文档,我删除了这些不相关的文档,并且聚合按预期正常工作。这是输出:

[{
        "_id": "65018e77b4f945eb41fafdd1",
        "fileName": "file-00.webp",
        "idMag": "6461d440a801c7bf4f5b8873",
        "imageVertical": "/assets/uploads/file-30.webp",
        "affiche": "/assets/uploads/file-e2.webp",
        "createdDate": 1684132928,
        "updatedDate": 1685528018,
        "deleted": "",
        "teaserImages": [
            "/assets/uploads/file-6a.webp",
            "/assets/uploads/file-00.webp",
            "/assets/uploads/file-19.webp"
        ]
    },
    {
        "_id": "65018e77b4f945eb41fafde5",
        "fileName": "file-0a.webp",
        "idMag": "6475eefaa801c7bf4f5b8ee3",
        "imageVertical": "/assets/uploads/file-3b.webp",
        "affiche": "/assets/uploads/file-0a.webp",
        "createdDate": 1685450490,
        "updatedDate": 1685450490,
        "deleted": "",
        "teaserImages": []
    }]

对于最后更新的查询:

db.images.aggregate([
  {
    $lookup: {
      from: "mags",
      let: { fileNameWithPrefix: { $concat: ["/assets/uploads/", "$fileName"] } },
      pipeline: [
        {
          $match: {
            $expr: {
              $or: [
                { $eq: ["$imageVertical", "$$fileNameWithPrefix"] },
                { $eq: ["$imageHorizontal", "$$fileNameWithPrefix"] },
                { $eq: ["$affiche", "$$fileNameWithPrefix"] },
                {$in: ["$$fileNameWithPrefix", "$teaserImages"]}
              ]
            }
          }
        },
        {
          $project: {
            _id: 1,
            fileName: 1,
            size: 1,
            createdDate: 1,
            updatedDate: 1,
            deleted: 1,
            sizeNumber: 1,
            fileNameWithPrefix: 1,
            affiche: 1,
            imageHorizontal: 1,
            imageVertical: 1,
            teaserImages: 1
          }
        }
      ],
      as: "joinedData"
    }
  },
  {
    $unwind: "$joinedData"
  },
  {
    $project: {
      _id: 1,
      idMag: "$joinedData._id",
      imageHorizontal: "$joinedData.imageHorizontal",
      imageVertical: "$joinedData.imageVertical",
      affiche: "$joinedData.affiche",
      fileName: 1,
      size: "$joinedData.size",
      createdDate: "$joinedData.createdDate",
      updatedDate: "$joinedData.updatedDate",
      deleted: "$joinedData.deleted",
      sizeNumber: "$joinedData.sizeNumber",
      teaserImages: "$joinedData.teaserImages"
    }
  }
]);
© www.soinside.com 2019 - 2024. All rights reserved.