Это не очень хорошая структура, но если она не находится под вашим контролем, то вам нужно что-то подобное с 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"
}}
])
вы можете сделать больше, но это спорно на образце учитывая то, что вы действительно хотите достичь.
В этой части я не знаю во время выполнения какое значение для отметки. Затем, как я могу сопоставить использование этого оператора return inner.match (/^mark /). А также записи [key]. Полная часть «total» не является статичной, которая может отличаться. – Raja
@ user1177950 Вам нужно перечитать, поскольку вы полностью потеряли все точки. Я добавляю код для соответствия «отметке», где ваши данные не дают четкого определения, является ли это «mark1» или «mark2» или что-то еще. Это данные ** ** **. Нам больше ничего не остается. Во-вторых, и самое главное, я говорю ** не делаю этого **. Эта структура очень плохая, и вы должны использовать структуру, которая была предоставлена в качестве альтернативы. Вам нужно учиться. –