Hinzufügen von Elementen zu einem array in MongoDB mit Mungo

Zuerst von allen, lassen Sie mich beginnen, indem Sie meine MongoDB-schema.

showTitle: String,
seasons: [{
  seasonNumber: String,
  episodes: [{
      episodeNumber: String,
      episodeTitle: String,
      episodeSynopsis: String
            }]  
         }]

Die grundlegende Idee für diese Sammlung ist zum speichern von tv-show-details. Die TV-shows enthalten kann, die mehrere Jahreszeiten und die einzelnen Jahreszeiten enthalten mehrere Episoden.

Ich bin ermöglicht Benutzern das hinzufügen von weiteren Jahreszeiten(nur seasonNumber) auf der client-Seite. Dies wird einen Wert übergeben, um die server-Seite. Dieser Teil funktioniert ganz gut, wie ich kann-sehen Sie sich den Wert, einen string, wenn ich console.log auf meinem server Seite.

Hier, meine API-Aufrufe dieser Funktion.

function saveReport(err, res, count, seasonId, seasonDetails)
{
  if(count == 0) //if 0 means not exist, so can add into DB
  {
    Show.update({_id: seasonId},{$push: {seasons:{seasonNumber: [seasonDetails]}}}, {upsert:true}, function(err, result)
    {
      console.log(result);
      res.json(result);
    });
  }
  else
  {
    res.json("TV Season already exists in MongoDB");
  }
}

module.exports.seasonsCreate = function(req, res)
{
  console.log("Calling the seasonsCreate function");
  var seasonId = req.params.id;
  var seasonDetails = req.body.season; //season number as a string(intended)

 //finding a specific showing using the id passed as parameter
 //$elemMatch is used to check if season number exists
 //using count to determine
  Show.findOne({_id: req.params.id, seasons: {$elemMatch: {seasonNumber: req.body.season}}}).count(function(err, count)
  {
    saveReport(err, res, count, seasonId, seasonDetails);
  });
}

Ich manuell(mit MongoDB-Befehl) Hinzugefügt, zwei Jahreszeiten in MongoDB. Saison 1 und Saison 2 mit 2 Episoden jeden. Jedoch, wenn ich versuche, um eine 3. episode über die client-Seite, passiert nichts. Das genaue Ergebnis zurückgegeben wird, ist dies:

Objekt {"ok": 0, n: 0, nModified: 0}

Ich getan habe, zu aktualisieren, bevor Sie mit einer ähnlichen Methode. Allerdings bin ich ein bisschen geworfen, weil dieser Zeit habe ich verschachtelte arrays statt nur Objekte. Ich habe auch versucht, mehrere Kombinationen:

  • mit/ohne push -
  • mit/ohne set -
  • mit/ohne upsert

Ich bin mir ziemlich sicher, das problem ist die Art, wie ich die Aktualisierung meiner Datenbank. Hoffe jemand kann etwas Licht hier. Danke !!

p/s: ich bin mit der neuesten version von Mongoose.

  • Das ist ein verschachteltes array. Also der Haken ist, müssen Sie finden ", die" Elemente des äußeren Arrays entspricht, die Sie aktualisieren möchten, das innere array in. Es ist möglich, mit $push, aber auch andere update-Operationen sind nicht so einfach. Ich würde empfehlen nicht, verwenden Sie eine verschachtelte array-und einen Weg zu Modell unterschiedlich.
  • haben Sie irgendwelche Vorschläge, wie ich mein Modell schema dann? Ich bin neu hier so Lesen, links wären auch hilfreich in Bezug auf die Definition schema.
  • Warum nicht das laden der Karte und speichern Sie es mit dem mongoose-apis?
  • Könnten Sie besser dran, zu Fragen, eine andere Frage für diese Antwort, zu erklären, was Sie erreichen wollen aus den Daten zu Lesen und zu schreiben. Hier ist das problem mit dem positions - $ operator die kann nur die index-position "erste" oder "äußere" array-element zu finden, in einer Abfrage. Eine grundlegende Vorschlag wäre, zu "glätten" und schließen Sie die "seasonNumer" in jeder episode Eintrag
  • das ist etwas ganz neues für mich, nicht wirklich sicher, was du meinst obwohl. es wäre wirklich hilfreich, wenn Ihr einige links zu lesestoff über was du redest, so dass ich Lesen konnte mehr. danke !!
  • Weil das nervt, auf den Punkt. Sie Lesen ein Objekt aus der Datenbank, so dass änderungen, die offline-und dann schreiben Sie wieder. Führt zu inkonsistenten Daten überall.
  • Es ist nicht Verschieden von dem, was eigentlich passiert ist, niemand garantiert Ihnen, dass nichts passiert zwischen dem Grafen und dem update. Ausgehend von der Annahme, kein ORM o ODM sollte überhaupt verwendet werden. So entfernen Sie Mungo und gehen aus einfachen MongoDB-Verbindung
  • Es sind Welten Unterschied. $push angefügt werden, um beliebige Inhalte in das array auf update. Was Sie vorschlagen, wird überschrieben alle änderungen ausgestellt wurden, die in zwischen den .find() und die .save()
  • und B3rn475, danke für Eure Vorschläge Jungs. Ich Schaffe es, es funktioniert, scheinbar habe ich mit pushAll all dies, während. Ich werde auf jeden Fall die Arbeit auf die Verbesserung meines schema-Modell, obwohl. sorry für die Mühe und nochmals vielen Dank !!

Schreibe einen Kommentar