I have a collection in mongodb where fields are nested under a language root:
{
en: {
title: \"eng title\",
content: \"eng content\",
You need to aggregate as below:
find
object to match only the records containing($exists) the language.Projection
object to project the fields.Code:
var currentLang = "en";
var project = {};
project["title"] = "$"+currentLang+".title";
project["content"] = "$"+currentLang+".content";
project["images"] = 1;
var find = {};
find[currentLang] = {"$exists":true};
db.collection.aggregate([
{$match:find},
{$project:project}
])
I'm not sure how you're querying, so I'll assume you're going directly through the mongo client. Assuming you have defined a variable
>currentLang = "en";
You can run an aggregation operation and using the $project operator, restructure the presentation of the document.
Here's an example that I've tested:
> db.test.aggregate({$project:
{_id: 0,
title: "$" + currentLang + ".title",
content: "$" + currentLang + ".content",
images: 1
}
}).pretty();
{
"images" : {
"mainImage" : "dataURL",
"thumbImage" : "dataURL"
},
"title" : "eng title",
"content" : "eng content"
}
If you want to combine this with an actual query, you can just include it as a $match operator, something like:
> db.test.aggregate(
{$match:
{"en.title": "eng title"}
},
{$project:
{_id: 0,
title: "$" + currentLang + ".title",
content: "$" + currentLang + ".content",
images: 1
}
}).pretty();