Я работаю над моделью MongoDB для хранения фотографий (/видео). Каждый файл может (необязательно) появляться в одном или нескольких альбомах. Моя модель выглядит так:
> db.files.find().pretty()
{
"_id" : ObjectId("600725fbba9901ec2caeba5f"),
"filename" : "first_picture.jpg",
"type" : "image",
"added" : 1611081211,
"views" : 9,
"tags" : [ ],
"albums" : [
ObjectId("6007d8cfc3b7ef3895f0a8d3")
]
}
{
"_id" : ObjectId("600729cf087c3cf47becee3c"),
"filename" : "first_video.mp4",
"type" : "video",
"added" : 1611082191,
"views" : 1,
"tags" : [ ],
"albums" : [ ]
}
> db.albums.find().pretty()
{
"_id" : ObjectId("6007d8cfc3b7ef3895f0a8d3"),
"name" : "Test",
"created" : 0
}
То, что я пытаюсь сделать, это использовать $lookup для создания одного документа, возвращаемого с документом album
и документами из коллекции files
, которые имеют ObjectId этого album
в массиве альбомов. Поскольку я не хочу загружать все файлы сразу, я хочу ограничить количество возвращаемых файлов.
Мой текущий запрос выглядит так:
db.albums.aggregate([
{
$lookup:{
from: "files",
let: { "albums": "$albums" },
pipeline: [
{ "$match": { "$expr": { "$in": ["$_id", "$$albums"] } } },
],
as: "file_list"
}
}
])
Судя по примерам, которые я видел, это должно работать. Но когда я запускаю запрос, я получаю:
2021-01-20T13:44:42.779-0800 E QUERY [thread1] Error: command failed: {
"ok" : 0,
"errmsg" : "$in requires an array as a second argument, found: missing",
"code" : 40081,
"codeName" : "Location40081"
} : aggregate failed :
Это говорит о том, что поле альбомов не является массивом, но оно есть, и оно присутствует в обоих документах. Что я делаю не так? Я рву на себе волосы!
Изменить: Ожидаемый результат:
{
"_id" : ObjectId("6007d8cfc3b7ef3895f0a8d3"),
"name" : "Test",
"created" : 0.
"files": [
{
"_id" : ObjectId("600725fbba9901ec2caeba5f"),
"filename" : "first_picture.jpg",
"type" : "image",
"added" : 1611081211,
"views" : 9,
"tags" : [ ],
"albums" : [
ObjectId("6007d8cfc3b7ef3895f0a8d3")
]
}
]
}
$lookup
должно быть наоборот: сfiles
наalbums
. - person J.F.   schedule 21.01.2021