优雅的重复子项列表

时间:2015-09-23 07:21:22

标签: mongodb

如何使用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相关。

1 个答案:

答案 0 :(得分:1)

在聚合中使用 $map ,如下所示:

db.collection.aggregate({"$project":{"resources":{"$map":{"input":"$resources","as":"el","in":"$$el.mediatype"}}}})