2015-02-04 2 views
1

Я хочу найти минимальное значение в документе MongoDB:Монго запрос - поиск минимального значения в пределах документа

Образец документа

db.marks.insert({"name" : "John", "subject1" : 100, "subject2" : 98, "subject3" : 99, "subject4" : 97}); 

Я хочу найти минимальное значение subject1,subject2,subject3,subject4 внутри каждого документа. Пытался использовать структуру агрегации для этого, но, похоже, работает в разных документах. Есть ли способ найти ценность внутри документа?

+0

Вы можете изменить модель данных? Что-то вроде {name: 'John', subject: [{name: "subject1", mark: 100}, {name: "subject2", mark: 98}]} сделало бы это намного проще. – joao

+0

Я могу это сделать. Но могу ли я получить минимальную отметку вместе с другими полями? –

+0

Я предложил, чтобы модель была легче найти самый низкий уровень по всем предметам. Если вы хотите добавить дополнительную информацию для каждого поддокумента, продолжайте. – joao

ответ

1

Вы можете агрегировать, как показано ниже:

  • $group именем для преобразования предметных полей в массив.
  • $project поле под названием score как $setUnion всех баллов на человека.
  • $unwindscore массив.
  • $group по названию еще раз, чтобы найти $min баллов на человека.

Код:

db.marks.aggregate([ 
{$group:{"_id":"$name", 
     "subject1":{$push:"$subject1"}, 
     "subject2":{$push:"$subject2"}, 
     "subject3":{$push:"$subject3"}, 
     "subject4":{$push:"$subject4"}}}, 
{$project:{"score":{$setUnion:["$subject1", 
           "$subject2", 
           "$subject3", 
           "$subject4"]}}}, 
{$unwind:"$score"}, 
{$group:{"_id":"$_id","minScore":{$min:"$score"}}} 
]) 
+0

Это решит мою проблему. Благодарю. –

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