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 !!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da bin ich sensing gefährlich schlecht beraten, die von Menschen erzählen, die Sie zu
.find()
die Daten dann.save()
es erläutere ich den grundlegenden Fall der "Abflachung" der Daten, um zu vermeiden, das verschachtelte array-Problem.Verschachtelte arrays leiden unter einem problem, dass die positions -
$
- operator würden Sie verwenden müssen, um match den index des gewünschten array-Elements zu aktualisieren, können nur auf die "äußere" array-element. Dies mag zwar in Ordnung sein, zu erkennen, dass element-und "push" auf ein inneres array dieses element, es ist einfach nicht möglich, um die position der inneren element-wenn man wollte-update, das innere element.Also ist die Idee nicht "nest-arrays", und die Struktur so können Sie wirklich effizient update innerhalb der zur Verfügung stehenden Einschränkungen.
Bessere Struktur wäre:
Nun, Sie nicht wirklich Locker hier nichts, und es ist nur ein kleines extra Vervielfältigung von Daten, aber zu einem geringen Preis.
Hinzufügen zum array:
Aktualisieren Sie ein element:
Oder auch:
Und wenn Sie nur wollte, dass alle Episoden für eine Staffel:
Die Keulen werden alle nicht übereinstimmenden Einträge aus dem array, wie es zurückgegeben wird, in der Abfrage.
So können Sie fast alles, was Sie wollen mit geringem Aufwand in die änderung der Daten Speicher, und mit atomaren updates, die nicht laufen in Probleme mit anderen Operationen ändern der Daten in einem unerwarteten Zustand sind, wie Sie laufen das Risiko von sonst.
$
für verschachtelte arrays.831
also nicht gerade eine neue Anfrage. Dennoch kann es nicht Schaden, für mehr Menschen-voting das Problem. Gibt es eine Magische Anzahl von Stimmen, machen dies zu einem top-Priorität 🙂