I got a collection with documents such as those:
{
"_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",
}
]
}
What I'm trying to get as result is this one with the conditions below.
{
"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",
}
]
}
The only real condition on that is to get all paths, that have the string at the field "web" set on true. (I know it could also be bool, but it doesn't matter in this case) The main problem is to concat the arrays "logos" and "pictures" into one array. I read some solutions using "$unwind". But in those cases, they are trying to concatenate one array.
This worked for me, but in my real case I got five different arrays containing those objects. And they have to result all in one array.
My solution so far looks as following (but doesn't work):
db.products.aggregate( [
{ $unwind: "$pictures" },
{ $unwind: "$logos" },
{ $group: { _id: null, pics: { $push: { $or: ["$pictures", "$logos"] } } } }
{ $project: { _id: 0, pictures: "$pics" } }
] );
As you can see there is still the condition checking on the "web"-flag missing. Also the output brings absolutely nothing. Not even an error message.
EDIT
I forgot an important detail on this question.
As I described in the upper part there are five different arrays that can appear in each document. It is also possible that there aren't any of them in each document. So it can also look like this:
{
"_id": 1,
"pictures": [
{
"path": "/a/bit/weird/path/to/picture.jpg",
"web": "false"
},
{
"path": "/another/weird/path/to/picture.jpg",
"web": "false",
}
]
}
That could be the difference between my problem the solved one, which my was marked as duplicate to. As @Styvane told me to do it gave me just tons of documents such as this:
{
"_id" : ObjectId("57f5026aaf39013d0c9186af"),
"web_images": null
}
It is possible that I get this error because of those documents which have some arrays missing.
$setUnionexpression in$filter:db.collection.aggregate([{"$project": { "web_images": { "$filter": { "input": { "$setUnion": [ "$pictures", "$logos" ] }, "as": "p", "cond": { "$eq": [ "$$p.web", "true" ] } } } } }])pis a variable name for each element in the concatenated array. To access that variable in thecondexpression, MongoDB required that you prefix it with$$and use the "dot notation" to access the subdocument field. I hope I answered your question.