mongodb - 合并来自多个 MongoDB 文档的数组
问题描述
我正在尝试编写一些查询,该查询将获取有关 YouTube 用户及其视频的文档,然后按时间顺序返回他们所有视频的单个列表。
到目前为止,我的查询(在猫鼬中):
return mongoose.model('creators').find({
id: {}
})
我得到这些结果:
[
{
"_id": "5b0891a3dcec4912601e32ce",
"name": "CaptainDisillusion",
"id": "UCEOXxzW2vU0P-0THehuIIeg",
"videos": [
{
"_id": "5b0891a3dcec4912601e32cf",
"name": "Quick D: A Fighter Jet Says Hi",
"id": "-NPmBkYb_mY",
"date": "2018-05-10T16:30:30.000Z"
}
],
"__v": 0
},
{
"_id": "5b08967b66d8321034176afb",
"name": "Curious Droid",
"id": "UC726J5A0LLFRxQ0SZqr2mYQ",
"videos": [
{
"_id": "5b0891a3dcec4912601e32cf",
"name": "Guest post bloggers wanted for the Curious Droid website",
"id": "sNLvdoValBw",
"date": "2018-05-23T16:30:30.000Z"
}
],
"__v": 0
}
]
理想情况下,我想做的是返回以下内容:
"videos": [
{
"_id": "5b0891a3dcec4912601e32cf",
"name": "Guest post bloggers wanted for the Curious Droid website",
"id": "sNLvdoValBw",
"date": "2018-05-23T16:30:30.000Z"
},
{
"_id": "5b0891a3dcec4912601e32cf",
"name": "Quick D: A Fighter Jet Says Hi",
"id": "-NPmBkYb_mY",
"date": "2018-05-10T16:30:30.000Z"
}
]
仅返回所有文档组合的一个数组,并按最新的优先顺序。
那有可能吗?如果可以,我该如何完成?
谢谢!
解决方案
你需要aggregate()
。无论是使用$unwind
还是$replaceRoot
在哪里拥有它:
return mongoose.model('creators').aggregate([
// { "$match": { ... } }, // A real condition to match the document
{ "$unwind": "$videos" },
{ "$replaceRoot": { "newRoot": "$videoes" } }
])
或$project
明确使用所有字段:
return mongoose.model('creators').aggregate([
// { "$match": { ... } }, // A real condition to match the document
{ "$unwind": "$videos" },
{ "$project": {
"_id": "$videos._id",
"name": "$videos.name",
"id": "$videos.id",
"date": "$videos.date"
}}
])
这些是将嵌入的数组内容提升到输出文档的“顶级”的唯一事物。
注意:对文档或数组内容的任何查询条件都应该在$unwind
. 这意味着应用$match
有效的查询条件,并可能$filter
首先在数组内容上应用投影。如果你不做那些“第一”,你就会为你的应用程序创造不必要的开销。
反正整个使用过程$unwind
真的挺贵的。实际上仔细查看您的查询模式并真正做出决定是否值得将文档嵌入,或者您的查询确实更频繁地适合将文档放置在单独的集合中会更明智。
推荐阅读
- java - 多个别名/证书的 Cacert 问题 - javax.net.ssl.SSLHandshakeException
- excel - 在 Sub 中使用私有函数会创建超出范围的下标?
- python - 整数变量不使用 python 存储在平面缓冲区中
- angular - Angular 8 库在接收数据后加载功能模块
- facebook - 为什么我的组在搜索结果中包含另一个国家/地区子域?
- oracle - ORACLE 中的日期映射或翻译
- firebase - 云功能:在没有数据库/VPC 的情况下跨实例存储简单的共享值?
- python - 如何附加项目之间最大差异的列表
- angular - 如何在像 span 这样的文本元素中使用 [color] 指令?
- c++ - RapidJSON - 使用通配符遍历具有不同成员名称的复杂 JSON 结构