首页 > 解决方案 > 合并来自多个 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"
            }
        ]

仅返回所有文档组合的一个数组,并按最新的优先顺序。

那有可能吗?如果可以,我该如何完成?

谢谢!

标签: mongodbmongoose

解决方案


你需要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真的挺贵的。实际上仔细查看您的查询模式并真正做出决定是否值得将文档嵌入,或者您的查询确实更频繁地适合将文档放置在单独的集合中会更明智。


推荐阅读