使用MongoDB将多个数组聚合到一个巨大的数组中

时间:2017-03-15 14:21:59

标签: javascript mongodb mongodb-query aggregation-framework

我收集了一些文件,如:

{
    "_id": 0,
    "pictures": [
        {
            "path": "/path/to/first/picture.jpg",
            "web": "true"
        },
        {
            "path": "/path/to/second/picture.jpg",
            "web": "true",
        }
    ],
    "logos": [
        {
            "path": "/path/to/first/logo.jpg",
            "web": "true"
        },
        {
            "path": "/path/to/second/logo.jpg",
            "web": "false",
        }
    ]
}
{
    "_id": 1,
    "pictures": [
        {
            "path": "/a/bit/weird/path/to/picture.jpg",
            "web": "false"
        },
        {
            "path": "/another/weird/path/to/picture.jpg",
            "web": "false",
        }
    ],
    "logos": [
        {
            "path": "/path/to/another/logo.jpg",
            "web": "false"
        },
        {
            "path": "/a/last/path/to/logo.jpg",
            "web": "true",
        }
    ]
}

我想要得到的结果是这个以下条件。

{ 
    "web_images": [
        {
            "path": "/path/to/first/picture.jpg",
            "web": "true"
        },
        {
            "path": "/path/to/second/picture.jpg",
            "web": "true",
        },
        {
            "path": "/path/to/first/logo.jpg",
            "web": "true"
        },
        {
            "path": "/a/last/path/to/logo.jpg",
            "web": "true",
        }
    ]
}

唯一真正的条件是获取所有路径,其中字段“web”的字符串设置为true。 (我知道它也可能是bool,但在这种情况下并不重要) 主要问题是将数组“logos”和“pictures”连接成一个数组。 我使用“$ unwind”阅读了一些解决方案。但在这些情况下,他们试图连接一个数组。

这对我有用,但在我的实际情况中,我有五个包含这些对象的不同数组。并且他们必须在一个阵列中产生所有结果。

<小时/> 到目前为止我的解决方案看起来如下(但不起作用):

db.products.aggregate( [
    { $unwind: "$pictures" },
    { $unwind: "$logos" },
    { $group: { _id: null, pics: { $push: { $or: ["$pictures", "$logos"] } } } }
    { $project: { _id: 0, pictures: "$pics" } }
] );

正如您所看到的,仍然存在“web”标志缺失的条件检查。输出也没有带来什么。甚至没有错误消息。

<小时/> 的修改

我忘记了这个问题的一个重要细节。

正如我在上半部分所描述的,每个文档中都有五个不同的数组可以。每个文档中也可能没有任何一个。所以它也可以是这样的:

{
    "_id": 1,
    "pictures": [
        {
            "path": "/a/bit/weird/path/to/picture.jpg",
            "web": "false"
        },
        {
            "path": "/another/weird/path/to/picture.jpg",
            "web": "false",
        }
    ]
}

这可能是我解决的问题之间的区别,我被标记为重复。正如@Styvane告诉我的那样,它给了我很多文件,比如:

{
    "_id" : ObjectId("57f5026aaf39013d0c9186af"),
    "web_images": null
}

由于那些缺少某些数组的文档,我可能会收到此错误。

1 个答案:

答案 0 :(得分:2)

您可以使用$filter$setUnion / $concatArrays运算符来连接和过滤文档。您还需要使用$ifNull运算符将缺少的字段替换为空数组。

<div>
  <h1>Title 1</h1>
  { title2.bind }
  <h3>Title 3</h3>
</div>