合并多个MongoDB文档中的数组
我正在尝试编写一些查询,以获取有关YouTuber及其视频的文档,然后按时间顺序返回所有视频的单一列表 到目前为止,我的查询(在Mongoose中): 我得到以下结果:合并多个MongoDB文档中的数组,mongodb,mongoose,Mongodb,Mongoose,我正在尝试编写一些查询,以获取有关YouTuber及其视频的文档,然后按时间顺序返回所有视频的单一列表 到目前为止,我的查询(在Mongoose中): 我得到以下结果: [ { "_id": "5b0891a3dcec4912601e32ce", "name": "CaptainDisillusion", "id": "UCEOXxzW2vU0P-0THehuIIeg", "videos": [ {
[
{
"_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()
。使用以及在何处使用:
return mongoose.model('creators').aggregate([
// { "$match": { ... } }, // A real condition to match the document
{ "$unwind": "$videos" },
{ "$replaceRoot": { "newRoot": "$videoes" } }
])
或显式与所有字段一起使用:
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"
}}
])
这些是将嵌入的数组内容提升到输出文档的“顶层”的唯一方法
注意:对文档或数组内容的任何查询条件都应在“之前执行。这意味着应用有效的for查询条件,并可能首先在数组内容上应用投影。如果你不先做这些,你就为你的应用程序创造了不必要的开销
无论如何,整个使用过程确实相当昂贵。实际上,更明智的做法是仔细研究您的查询模式,并真正决定是否确实值得嵌入文档,或者您的查询是否确实更适合将文档放在单独的集合中。您需要聚合()
。使用以及在何处使用:
return mongoose.model('creators').aggregate([
// { "$match": { ... } }, // A real condition to match the document
{ "$unwind": "$videos" },
{ "$replaceRoot": { "newRoot": "$videoes" } }
])
或显式与所有字段一起使用:
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"
}}
])
这些是将嵌入的数组内容提升到输出文档的“顶层”的唯一方法
注意:对文档或数组内容的任何查询条件都应在“之前执行。这意味着应用有效的for查询条件,并可能首先在数组内容上应用投影。如果你不先做这些,你就为你的应用程序创造了不必要的开销
无论如何,整个使用过程确实相当昂贵。实际上,更明智的做法是仔细研究您的查询模式,并真正决定是否确实值得嵌入文档,或者您的查询是否确实更适合将文档放在单独的集合中。您需要使用
$unwind
平铺数组项,然后将内部$videos
与$sort
一起升级为新的根项目,以订购视频项目
db.tests.aggregate([
{$match: ...},
{$unwind: "$videos"},
{$replaceRoot: {newRoot: "$videos"}},
{$sort: {date: -1}} // Newest first
])
您需要使用
$unwind
展开阵列项目,然后将内部$videos
升级为新的根项目,并使用$sort
来订购视频项目
db.tests.aggregate([
{$match: ...},
{$unwind: "$videos"},
{$replaceRoot: {newRoot: "$videos"}},
{$sort: {date: -1}} // Newest first
])
如果您希望查询返回的只是“只是”嵌入数组中的数据,那么只需“首先不要嵌入”。“嵌入”数据的概念是当您的访问模式希望在单个请求中同时包含父级和详细信息而不产生开销时。如果你只是想一直把这些分开,那么就把这些集合分开。任何“仅获取数组项”的操作都会导致比嵌入所要避免的开销更大的开销,如果您想使用它,请更改数据结构。嗨,尼尔,我完全同意您的看法。但这只是我希望使用数据的一种方式,在这种情况下,不嵌入它们肯定是一种优势,但也有理由嵌入它们。如果
视频数组包含多个视频,那么输出是什么样子的?全部显示?是的,全部显示。如果您希望查询返回的只是“只是”嵌入数组中的数据,那么只需“首先不要嵌入”。“嵌入”数据的概念是当您的访问模式希望在单个请求中同时包含父级和详细信息而不产生开销时。如果你只是想一直把这些分开,那么就把这些集合分开。任何“仅获取数组项”的操作都会导致比嵌入所要避免的开销更大的开销,如果您想使用它,请更改数据结构。嗨,尼尔,我完全同意您的看法。但这只是我希望使用数据的一种方式,在这种情况下,不嵌入它们肯定是一种优势,但也有理由嵌入它们。如果视频数组包含多个视频,那么输出是什么样子的?全部展示?是的,全部展示。