如何使用MongoDB将路径投影转换为单个数组?
使用实际数据,通过
导入此datapackage.json wget -c https://raw.githubusercontent.com/datasets/language-codes/master/datapackage.json
mongoimport -d lang_db -c lang_meta datapackage.json --jsonArray
假设我需要资源中使用的所有媒体类型的列表,重复...所以最简单的语法db.lang_meta.distinct("resources.mediatype")
,不是这个问题的解决方案......
并且db.lang_meta.find({},{"resources.mediatype":1}).pretty()
不会生成单个列表,而是复杂对象
{"_id" : ObjectId("56011be94564569fc920eda4"),
"resources" : [
{
"mediatype" : "text/csv"
},
{
"mediatype" : "text/csv"
},
{
"mediatype" : "text/csv"
},
{
"mediatype" : "text/csv"
}
]}
为了降低复杂性,我们可以尝试map()
,
var aux = db.lang_meta.find().map(function(c) {
var ret = [];
for (var i=0; i<c.resources.length; i++)
ret.push( c.resources[i].mediatype );
return ret;
});
var solution = aux[0];
但是它不优雅(!)... mongoDB 中有一个简单的语法来执行此操作?
此问题与其他question/solution相关。
答案 0 :(得分:1)
在聚合中使用 $map ,如下所示:
db.collection.aggregate({"$project":{"resources":{"$map":{"input":"$resources","as":"el","in":"$$el.mediatype"}}}})