【问题标题】:elegant list of repeated sub-items重复子项的优雅列表
【发布时间】:2015-09-23 07:21:22
【问题描述】:

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    像这样在聚合中使用 $map

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

    【讨论】:

    • 使用db.lang_meta.aggregate({"$project":{"resources":{"$map":{"input":"$resources","as":"el","in":"$$el.mediatype"}}}})时出现错误消息:异常:无效的运算符'$map'`
    • 看起来你使用的是旧版本的 MongoDB,请检查release note
    • 我在 Debian Stable 并且 db.version()=2.4.10 ,您使用 wgetmongoimport 来测试您的查询?
    • @PeterKrauss $map 支持 2.6 及更高版本,因此您应该切换到新版本以测试 $map
    • Ops,是的 ;-( ...我的 Debian 是 8.2 (jessie),并且您的链接显示“当前软件包仅适用于 Debian 7 (Wheezy)”...
    猜你喜欢
    • 2012-04-23
    • 2015-12-05
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2016-10-09
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多