gpt4 book ai didi

javascript - 使用 MongoDB 将多个数组聚合成一个巨大的数组

转载 作者:可可西里 更新时间:2023-11-01 10:16:07 26 4
gpt4 key购买 nike

我得到了一个包含这些文档的集合:

{
"_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
}

我得到这个错误的原因可能是那些缺少一些数组的文档。

最佳答案

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

db.collection.aggregate([
{ "$project": {
"web_images": {
"$filter": {
"input": {
"$setUnion": [
{ "$ifNull": [ "$pictures", [] ] },
{ "$ifNull": [ "$logos", [] ] }
]
},
"as": "p",
"cond": { "$eq": [ "$$p.web", "true" ] }
}
}
}},
{ "$match": { "web_images.0": { "$exists": true } } }
])

关于javascript - 使用 MongoDB 将多个数组聚合成一个巨大的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com