我有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"
}
我的最后一次尝试很好地聚合了 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"
}
}
]);