我收集了一些文件,如:
{
"_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
}
由于那些缺少某些数组的文档,我可能会收到此错误。
答案 0 :(得分:2)
您可以使用$filter
和$setUnion
/ $concatArrays
运算符来连接和过滤文档。您还需要使用$ifNull
运算符将缺少的字段替换为空数组。
<div>
<h1>Title 1</h1>
{ title2.bind }
<h3>Title 3</h3>
</div>