mongodb - 如果属性与第二个集合的任何属性匹配,则 MongoDB leftjoin
问题描述
我是 MongoDB 的新手,正在努力解决以下问题。
我有 2 个集合,结构如下:
标签集合:
{
"_id": "10",
"assets": [
{
"_id": "11",
"path": "aa.png"
},
{
"_id": "22",
"path": "gg.png",
}
]
},
{
"_id": "22",
"assets": [
{
"_id": "33",
"path": "jj.png"
},
{
"_id": "44",
"path": "kk.png",
}
]
}
广告集合:
{
"_id": "64",
"value": "zuzu",
"default_values": {
"background_image_1": "aa.png",
"brand_image": "bb.png",
"background_image_2": "cc.png",
"background_image_3": "dd.png",
"random_image_1": "ee.png"
}
},
{
"_id": "75",
"value": "gogo",
"default_values": {
"background_image_1": "aa.png",
"background_image_2": "gg.png",
"background_image_3": "hh.png",
"background_image_4": "ii.png",
"background_image_5": "jj.png"
}
}
如果“路径”与 中的任何属性有任何匹配"default_values"
,我需要将 添加"value"
到对象中,如下所示。
预期结果:
{
"_id": "10",
"assets": [
{
"_id": "11",
"path": "aa.png",
"value": ["zuzu", "gogo"]
},
{
"_id": "22",
"path": "gg.png",
"value": ["gogo"]
}
]
},
{
"_id": "22",
"assets": [
{
"_id": "33",
"path": "jj.png",
"value": ["gogo"]
},
{
"_id": "44",
"path": "kk.png",
"value": []
}
]
}
最后一件事,我到达Tags
了聚合之后。
任何帮助将不胜感激!
解决方案
每个都asset
需要单独处理,因此您必须从$unwind开始。在下一步中,您可以使用自定义连接条件运行 $lookup,它将数据与Adverts
. 内部管道有点复杂,因为您需要先运行$objectToArray才能$filter该数组并找到匹配的图像。在查找阶段之后,您需要$group来组合您Tags
的基于_id
值。
db.Tags.aggregate([
{
$unwind: "$assets"
},
{
$lookup: {
from: "Adverts",
let: { path: "$assets.path" },
pipeline: [
{
$project: {
value: 1,
img: {
$filter: {
input: { "$objectToArray": "$default_values" },
cond: { $eq: [ "$$this.v", "$$path" ] }
}
}
}
},
{ $match: { $expr: { $gt: [ { $size: "$img" }, 0 ] } } },
{ $project: { _id: 0, value: 1 } }
],
as: "value"
}
},
{
$group: {
_id: "$_id",
assets: {
$push: {
_id: "$assets._id",
path: "$assets.path",
value: { $map: { input: "$value", in: "$$this.value" } }
}
}
}
}
])
推荐阅读
- spring - Spring Data R2DBC。实体创建
- python - 使用 API 响应中的访问令牌打开 url
- android - 在 MotionLayout 进行时视图操作不起作用
- r - 按包含系统日期的行子集数据框
- c++ - 将数组索引复制到另一个数组
- c++ - 问题:“无法将参数 1 从 'double' 转换为 'char(*)(double)'”
- android - 从对象列表中获取特定的 object.value kotlin
- python - 如何使用 django 和 celery 在 tasks.py 中创建定期任务
- sql - SQL查询根据先前的值计算运行计数器
- python - 错误:OSError:libmediainfo.so.0:无法打开共享对象文件:没有这样的文件或目录