如何解决mongodb-将嵌套对象数组合并为一个,保留所有数据
我在mongodb 4.4.0中有2个集合。 我有一个包含所有视频和一些相关字段的视频集合,还有一个称为用户的集合,我在其中存储所有用户以及他们已完成的视频列表,包括他们在单个视频上放置的注释。 现在,我必须获取所有视频的列表,并结合用户集合中包含的视频字段,仅在明显存在对应关系的情况下
视频
{
"_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa01"),"title": "Video title 1","duration" : 120,"author" : "John Doe"
},{
"_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa02"),"title": "Video title 2","duration" : 180,"author" : "Maria Hernandez"
},{
"_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa03"),"title": "Video title 3","duration" : 75,"author" : "Henry Ford"
}
用户(仅一个用于演示)
{
"_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbb01"),"fullname": "James Smith","videos":
[
{
"video_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa01"),"views": 12,"completed": true,"notes": "very fun video","tags": ["fun","best"]
},{
"video_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa02"),"views": 64,"completed": false,"notes": "very difficult to understand","tags": ["hard","training","sport"]
}
]
}
期望的结果合并对象,假设我正在为用户bbbbbbbbbbbbbbbbbbbbbbbbbb01进行过滤:
{
"_id": ObjectId("bbbbbbbbbbbbbbbbbbbbbb01"),"videos":
[
{
"video_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa01"),"author" : "John Doe"
"views": 12,"best"]
},{
"video_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa02"),"author" : "Maria Hernandez"
"views": 64,"sport"]
},{
"video_id": ObjectId("aaaaaaaaaaaaaaaaaaaaaa03"),"author" : "Henry Ford"
}
]
}
例如,我在Google和SO上进行了大量搜索: MongoDB - $lookup in complex nested array或 Merge two array objects together in Mongodb from $Lookup
我正在尝试使用$查找和$ mergeObjects,但是我无法获得想要的结果。
解决方法
您可以尝试
-
$group
设为null,并制作users
数组
db.users.aggregate([
{
$group: {
_id: null,users: { $push: "$$ROOT" }
}
},
-
$lookup
具有视频收藏夹,并以videos
数组的形式获取所有视频
{
$lookup: {
from: "videos",pipeline: [],as: "videos"
}
},
-
$project
更新users.videos
数组 -
$map
迭代用户数组的循环,合并来自内部地图的当前对象和视频数组, -
$map
迭代来自视频集合的视频数组循环 -
$reduce
迭代users.videos
循环,如果video_id
匹配则匹配条件,然后返回视频对象并与视频合并,否则返回空白对象。
{
$project: {
users: {
$map: {
input: "$users",as: "user",in: {
$mergeObjects: [
"$$user",{
videos: {
$map: {
input: "$videos",as: "video",in: {
$mergeObjects: [
"$$video",{
$reduce: {
input: "$$user.videos",initialValue: {},in: {
$cond: [
{ $eq: ["$$video._id","$$this.video_id"] },"$$this","$$value"
]
}
}
}
]
}
}
}
}
]
}
}
}
}
},
-
$unwind
解构用户数组 -
$replaceRoot
替换root用户对象
{ $unwind: "$users" },{ $replaceRoot: { newRoot: "$users" } }
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。