-1

У меня есть JSON как это:как запросить вложенную JSON с помощью MongoDB

"marks":{ 
    "sem1" :{ 
     "mark1":10, 
     "total":100 
    }, 
    "sem2":{ 
     "mark2":20, 
     "total":200 
    }, 
    "sem3":{ 
     "mark2":30, 
     "total":300 
    } 
} 

мне нужен результат, как

mark total sem 

10 100  sem1 
20 200  sem2 
30 300  sem3 

Как я могу достичь выше формате с использованием MonogoDB query.query связано Jaspersoft средство очень полезно.

ответ

1

Это не очень хорошая структура, но если она не находится под вашим контролем, то вам нужно что-то подобное с MapReduce для обработки JavaScript:

db.collection.mapReduce(
    function() { 
     var doc = this, 
      marks = doc.marks; 

     Object.keys(marks).forEach(function(key) { 
     //emit(key, doc["marks"][key]); 
     var matched = Object.keys(marks[key]).filter(function(inner) { 
      return inner.match(/^mark/); 
     }); 

     if (matched.length > 0) { 
      //emit(matched[0], 1); 
      var myMatched = matched[0]; 
      emit(
      marks[key][myMatched], { 
       total: marks[key].total, 
       sem: key 
      } 
     ); 
     } 
     }); 
    }, 
    function() {}, // null reducer not required 
    { "out": { "inline": 1 } } 
); 

не совсем нужного результата, но это путь mapReduce делает это. Это необходимо, потому что ваша структура не может быть запрошена или проанализирована с помощью традиционных средств.

Чтобы сделать это лучше, вам нужно вместо этого:

{ 
    "marks": [ 
     { "semester": "sem1", "mark": 10, "total": 100 }, 
     { "semester": "sem2", "mark": 20, "total": 200 }, 
     { "semester": "sem3", "mark": 30, "total": 300 } 
    ] 
} 

Тогда вы запрашиваете с рамками агрегации, что гораздо лучше, так как он использует собственный код, а не JavaScript обозначения для обхода:

db.collection.aggregate([ 
    { "$unwind": "$marks" }, 
    { "$project": { 
     "mark": "$marks.mark", 
     "total": "$marks.total", 
     "sem": "$marks.semester" 
    }} 
]) 

вы можете сделать больше, но это спорно на образце учитывая то, что вы действительно хотите достичь.

+0

В этой части я не знаю во время выполнения какое значение для отметки. Затем, как я могу сопоставить использование этого оператора return inner.match (/^mark /). А также записи [key]. Полная часть «total» не является статичной, которая может отличаться. – Raja

+0

@ user1177950 Вам нужно перечитать, поскольку вы полностью потеряли все точки. Я добавляю код для соответствия «отметке», где ваши данные не дают четкого определения, является ли это «mark1» или «mark2» или что-то еще. Это данные ** ** **. Нам больше ничего не остается. Во-вторых, и самое главное, я говорю ** не делаю этого **. Эта структура очень плохая, и вы должны использовать структуру, которая была предоставлена ​​в качестве альтернативы. Вам нужно учиться. –

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