2015-09-18 11 views
5

Teraz walczę z redact i nie jestem pewien, aby to zrozumieć.Redact in mongodb wydaje mi się niejasny

Właśnie przeczytałem docs i próbował użyć redagować on a klasach zbiórki (chodzi z MongoDB szkolenia online)

dokument w zbiorze "klas" wygląda następująco:

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 57.92947112575566 
     }, 
     { 
      "type" : "quiz", 
      "score" : 21.24542588206755 
     }, 
     { 
      "type" : "homework", 
      "score" : 68.19567810587429 
     }, 
     { 
      "type" : "homework", 
      "score" : 67.95019716560351 
     }, 
     { 
      "type" : "homework", 
      "score" : 18.81037253352722 
     } 
    ] 
} 

I użyj następującego zapytania:

db.grades.aggregate([ 
    { $match: { student_id: 0 } }, 
    { 
     $redact: { 
      $cond: { 
       if: { $eq: [ "$type" , "exam" ] }, 
       then: "$$PRUNE", 
       else: "$$DESCEND" 
      } 
     } 
    } 

] );

W tej kwerendzie każdy typ egzaminu zostaje znaleziony, ten pod-dokument powinien zostać wykluczony. I to działa, wynik jest:

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
    { 
     "type" : "quiz", 
     "score" : 21.24542588206755 
    }, 
    { 
     "type" : "homework", 
     "score" : 68.19567810587429 
    }, 
    { 
     "type" : "homework", 
     "score" : 67.95019716560351 
    }, 
    { 
     "type" : "homework", 
     "score" : 18.81037253352722 
    } 
] 
} 

ale jeśli odwrócić sytuację, spodziewam się, że tylko egzaminy są przechowywane w wyniku:

if: { $eq: [ "$type" , "exam" ] }, 
     then: "$$DESCEND", 
     else: "$$PRUNE" 

jednak wynik jest pusta.

Nie rozumiem, dlaczego nie uwzględniono podtypu dokumentu "egzamin".

+1

Kolejna praca domowa uniwersytetu mongodb. – styvane

+2

@ user3100115 Zadania domowe nie muszą być złymi pytaniami, o ile są napisane w sposób, który wymaga wglądu, a nie tylko gotowego rozwiązania, które dostaje ocenę wystarczająco dobrą. – Philipp

+1

@Philipp Jednakże wiem z doświadczenia z pierwszej ręki, że uczniowie uczą się każdego kroku w dość długi sposób. Szczegółowe, dodam, a dokumentacja też nie jest zła. Z mojego punktu widzenia celem każdej z klas jest dostarczenie studentowi wystarczających informacji, aby dokumentacja stała się mniej lub bardziej przypomnieniem. W tym kontekście pytanie wraz z istniejącym zapytaniem wydaje się trochę ... ... arbitralne dla mnie. –

Odpowiedz

8

Etap rozpoczyna się od głównego dokumentu i jego pól i tylko wtedy, gdy dokument ten spełnia warunek do $$DESCEND, sprawdza pod-dokumenty zawarte w tym dokumencie. Oznacza to, że pierwszą rzeczą $ redagować robi z dokumentu jest zbadać to:

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [] // Some array. I will look at this later. 
} 

To nawet nie znaleźć pole type tutaj, więc $eq: [ "$type" , "exam" ] jest fałszywe. Co powiedziałeś redactowi zrobić, gdy warunek jest fałszywy? else: "$$PRUNE", więc cały dokument jest przycinany przed zbadaniem pod-dokumentów.

Aby obejść ten problem, sprawdź, czy $type ma wartość "exam" lub nie istnieje. Nie poprosiłeś o jednoznacznie o działające rozwiązanie, więc zostawię to jako ćwiczenie dla ciebie, aby dowiedzieć się, jak to zrobić.

+0

ok dzięki. Nie szukałem rozwiązania, ale szukałem wytłumaczenia, a twoje było świetne. Wielkie dzięki. –

+0

Próbuję zaimplementować sugerowane obejście, ale nie mogę go uruchomić. Dowolny przykładowy kod roboczy zostałby doceniony! – papaiatis

+0

@papaiatis Zadaj nowe pytanie z przykładowym dokumentem i kodem, który już wypróbowałeś. – Philipp

Powiązane problemy