2016-10-20 15 views
2

I Element innerhalb verschachtelter arrray in mongoDB löschen bin zu kämpfen.Suchen und löschen Dokument innerhalb verschachtelte Array

Lets sagen, ich habe dieses Schema:

var question = new Schema({ 
    problem: { 
    type: String, 
    required: true 
    }, 
    multipleChoices: [{ 
    type: String, 
    required: true 
    }], 
    correctAnswer: { 
    type: Number, 
    required: true 
    } 
}); 

var testCategorySchema = new Schema({ 
    category: { 
    type: String, 
    required: true 
    }, 
    tests: [{ 
    version: { 
     type: String, 
     required: true 
    }, 
    questions: [question] 
    }] 
}); 

Zum Beispiel habe ich Instanz dieses Schema wie folgt aus:

{ 
    category: "Math", 
    tests: [ 
    { 
     _id : ObjectId("580859310a0d4b40ac1c6034"), 
     version: "1A", 
     questions: [ 
     { 
      problem: "blablabla", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ], 
      correctAnswer: 1 
     }, 
     { 
      problem: "blibliblibli", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     } 
     ] 
    }, 
    { 
     _id : ObjectId("580859310a0d4r40ax1c5034"), 
     version: "1B", 
     questions: [ 
     { 
      problem: "auauauauau", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     }, 
     { 
      problem: "blibliblibli", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     } 
     ] 
    } 
    ] 
} 

Zum Beispiel, wie kann ich Problem löschen: "blablabla" in der Kategorie Mathematik und Version 1A mit mongooseJS?

ich bereits Problem in Mathe Kategorie und Version 1A mit diesem Code zu löschen:

TestCategory 
    .findOne(
     { 
     category: req.params.testCategory, 
     'tests.version': req.params.testVersion 
     }, 
     { 
     'tests.version.$': 1 
     } 
    ) 
    .then(function(testVersion) { 
     res.send(testVersion); 
    }) 
    .catch(function(err) { 
     console.log(err); 
     next(err); 
    }); 

Zum Beispiel habe ich Mathe Kategorie und Version 1A zu suchen, ist das Ergebnis von diesem Code wie folgt:

_id: "580859190a0d4b40ac1c6033", 
tests: [ 
    { 
     _id : ObjectId("580859310a0d4b40ac1c6034"), 
     version: "1A", 
     questions: [ 
     { 
      problem: "blablabla", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ], 
      correctAnswer: 1 
     }, 
     { 
      problem: "blibliblibli", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     } 
     ] 
    } 
] 

Das Ergebnis bereits gefiltert, so dass nur Version 1A angezeigt wird (obwohl categoryId noch angezeigt wird). Jetzt bin ich verwirrt, wie man die Frage in der richtigen und guten Weise löscht.

+1

Haben Sie etwas noch versucht, dies zu erreichen? – Shrabanee

+0

Ich habe bereits versucht, etwas, lassen Sie mich die Frage – Kim

+1

@Shrabanee aktualisiert – Kim

Antwort

0

Sie benötigen update mit dem Positions Operator $ verwenden, um den richtigen Test zu aktualisieren und dann $pull verwenden, um die Frage zu entfernen:

TestCategory.update(
    { 
     category: 'Math', 
     'tests.version': '1A' 
    }, 
    { 
     $pull: { 
      'tests.$.questions': { problem: 'blablabla' } 
     } 
    } 
) 
+0

'$ Pull aktualisiert: { 'Tests $ Fragen..': {Problem: 'blablabla'} }' – Kim

+0

Wie kann ich es löschen, indem Sie die Frage/Problem Ich würde? – Kim

+0

Sie aufgefordert, um den Wert "Problem" zu entfernen. In Ihrem Schema und Beispieldokument haben Sie keine Problem-ID, also wie möchten Sie sie löschen? Wenn Sie ID pro Frage haben, ersetzen Sie einfach das 'Problem' mit' _id' im obigen Code, ich glaube nicht, dass ich das erklären muss. Sie müssen selbst nachdenken und versuchen, diese Fragen zu stellen. – TomG

Verwandte Themen