[英]Mongodb $lookup nested objects with pipeline
我有以下架构Thing
:
{
name: "My thing",
files: [
{
name: "My file 1",
versions: [
{
file_id: ObjectId("blahblahblah")
},
{
file_id: ObjectId("blahblahblah")
},
],
},
{
name: "My file 2",
versions: [
{
file_id: ObjectId("blahblahblah")
},
{
file_id: ObjectId("blahblahblah")
},
],
}
]
}
然后我有一个File
模式:
{
_id: ObjectId("blahblah"),
type: "image",
size: 1234,
}
Thing
模式中的file_id
是File
模式的_id
的 REF。
我想$lookup
我的Thing
中的所有文件。 所以我从这个开始:
{
"$lookup": {
"from": "files",
"let": { "files": "$files" },
"pipeline": [
{ "$match": { "$expr": { "$in": [ "$_id", "$$files.versions.file_id" ] } } }.
],
"as": "files.versions.file"
}
}
但这显然是错误的。 有人可以帮忙吗?
问题是当我们$$files.versions.file_id
访问 ids 时,它将返回 ids 数组数组,因此$in
将不匹配嵌套的 ids 数组,
我可以看到您正在尝试在同一嵌套级别中投影文件详细信息,因此直接查找不会在嵌套数组中设置该详细信息,您必须在设置文件详细信息之前先解构数组,
$unwind
解构files
数组$unwind
解构versions
数组$lookup
与files
集合并传递files.versions.file_id
作为 localField$unwind
解构files.versions.file_id
数组$group
按name
和file name
并重新构建versions
数组$group
仅按name
并重建files
数组 { $unwind: "$files" },
{ $unwind: "$files.versions" },
{
$lookup: {
from: "files",
localField: "files.versions.file_id",
foreignField: "_id",
as: "files.versions.file_id"
}
},
{ $unwind: "$files.versions.file_id" },
{
$group: {
_id: {
name: "$name",
file_name: "$files.name"
},
versions: { $push: "$files.versions" }
}
},
{
$group: {
_id: "$_id.name",
files: {
$push: {
name: "$_id.file_name",
versions: "$versions"
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.