2015-09-18 11 views
5

Sto combattendo con la redazione in questo momento e non sono sicuro di capirlo.Redact in mongodb mi sembra oscuro

Ho appena letto la documentazione e ha cercato di usare redigere su un gradi di raccolta (si tratta di una formazione on-line MongoDB)

Un documento della collezione "gradi" si presenta così:

{ 
    "_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 utilizzare la seguente query:

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

] );

Con questa query, ogni tipo di esame viene trovato, questo documento secondario deve essere escluso. E funziona, il risultato è:

{ 
    "_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 
    } 
] 
} 

ma se invertire la condizione, mi aspetto che solo gli esami sono conservati nel risultato:

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

tuttavia il risultato è vuoto.

Non capisco perché il documento secondario di tipo "esame" non sia incluso.

+1

Ancora un altro compito di università mongodb. – styvane

+2

@ user3100115 Le domande per i compiti a casa non sono necessariamente domande sbagliate, purché siano scritte in un modo che cerca informazioni e non solo una soluzione completa che ottiene un voto abbastanza buono. – Philipp

+1

@Philipp Tuttavia, so per esperienza diretta che agli studenti viene insegnato ogni fase in modo piuttosto lungo. Dettagliato, potrei aggiungere, e anche la documentazione non è male. Dal mio punto di vista, è lo scopo di ciascuna delle classi di fornire allo studente informazioni sufficienti in modo che la documentazione diventi più o meno un promemoria. In quel contesto, la domanda insieme alla query esistente sembra un po '... ... arbitraria per me. –

risposta

8

La fase $redact inizia nel documento radice e nei relativi campi e solo quando tale documento soddisfa la condizione $$DESCEND, esamina i documenti secondari inclusi in tale documento. Ciò significa che la prima cosa che $ Oscura fa con il documento è esaminare questo:

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

Non ha nemmeno trovare un campo type qui, quindi $eq: [ "$type" , "exam" ] è falso. Cosa hai detto a $ redact da fare quando la condizione è falsa? else: "$$PRUNE", quindi l'intero documento viene eliminato prima dell'esame dei documenti secondari.

Come soluzione, verificare se $type è "exam" o non esiste. Non hai chiesto esplicitamente una soluzione funzionante, quindi lascerò che sia un esercizio per te per capire come farlo.

+0

ok grazie. Non stavo cercando una soluzione ma stavo cercando una spiegazione e la tua è stata fantastica. Molte grazie. –

+0

Sto cercando di implementare la soluzione alternativa suggerita ma non riesco a farlo funzionare. Qualunque esempio di codice funzionante sarebbe apprezzato! – papaiatis

+0

@papaiatis Si prega di fare una nuova domanda con il tuo documento di esempio e il codice che hai già provato. – Philipp

Problemi correlati