2015-09-23 3 views
0

Как преобразовать проекцию пути в единый массив с помощью 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]; 

но это не элегантный (!) ... Есть целый простой синтаксис в mongoBD для этого?


Этот вопрос связан с этим другом question/solution.

ответ

1

Использование $map в агрегации, как это:

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

Сообщение об ошибке при использовании 'db.lang_meta.aggregate ({ "$ проект": { "ресурсы": { "$ карте": {" вход ":" $ resources "," as ":" el "," in ":" $$ el.mediatype "}}}})': exception: invalid operator '$ map' ' –

+0

похоже, что вы использовали старую версию of MongoDB проверить это [примечание к выпуску] (http://docs.mongodb.org/manual/release-notes/2.6/) – Yogesh

+0

Я нахожусь в Debian Stable и db.version() = 2.4.10, вы используете 'wget' и 'mongoimport', чтобы проверить ваш запрос? –

Смежные вопросы