Laut MongoDB- Dokumentation ist $pushAll
seit Version 2.4 veraltet. Es bleibt jedoch der Operator, in den Array#push übersetzt wird.
Unter der Annahme, dass dies keine bahnbrechende Änderung ist, denke ich, dass es eine bequeme Lösung wäre, da einige Implementierungen möglicherweise nicht auf $pushAll
angewiesen sind. Tatsächlich unterstützt Azures eigene MongoDB-Implementierung den $pushAll
-Operator AFAIK nicht.
Das Verlassen von pushAll ist definitiv eine Priorität, aber faire Warnung, Mongoose unterstützt documentdb im Moment _nicht_, also benutzen Sie es auf eigene Gefahr
Dies kann die Auswirkungen von Array.push auf $pushAll abmildern. Ich habe es selbst ausprobiert und scheint zu funktionieren.
myArray.push(myObject); //breaks on DocumentDB with Mongo API because of $pushAll
stattdessen verwenden
myArray = myArray.concat([myObject]); //this uses $set so no problems
@vkarpov15 Die Unterstützung von DocumentDB mit dem Mongo-Protokoll (also nicht DocumentDB wie es ist) wäre fantastisch, auch wenn ich verstehen kann, dass die Projektprioritäten auf Mongo liegen. Leider scheint Microsoft nur eine angemessene Teilmenge der neuesten Mongo-API (3.x) implementiert zu haben, sodass veraltete Inhalte, die aus 2.x stammen, möglicherweise nicht funktionieren.
In 4.6.4 können Sie die Option usePushEach
in Schemas verwenden: new Schema({ arr: [String] }, { usePushEach: true });
Begann mit diesem Problem bei Mongo 3.6 und Mongoose 4.13.6, message: 'Unknown modifier: $pushAll',
Lösungsvorschlag funktioniert nicht:
var layerSchema = mongoose.Schema({
(...)
},
{
usePushEach: true
});
Es ist seltsam, dass dies immer noch ein Problem mit den aktualisierten Bibliotheken ist?
Genau wie Knutole hier erstelle ich Modelle mit Mungo und ich weiß nicht, ob / wo ich das beheben kann.
Dieser Vorschlag löst das Problem in Mongodb 3.6 für mich.
Bearbeiten 1:
Vergiss es hat auch hier nicht funktioniert.
Bearbeiten 2:
Die Lösung bestand darin, auf Mongo 3.4 weiterzulaufen
Dasselbe Problem hier mit Mongo 3.6
Jedes Push- und Save-on-Array-Feld generiert den Fehler: Unbekannter Modifikator: $pushAll
Mit dem neuesten Mongoose auch ...
Problemumgehung usePushEach: true
scheint für uns zu funktionieren. MongoDB 3.6 + db.adminCommand({ setFeatureCompatibilityVersion: "3.6" })
@knutole , auf welches Problem stößt du? Diese Lösung hat für mich funktioniert. @frguthmann Am sichersten wäre es, diese Zeile allen Modellen hinzuzufügen, wenn Sie MongoDB 3.6+ verwenden.
Mongo 3.6 wurde kürzlich veröffentlicht und hat die Unterstützung für $pushAll entfernt , sodass jeder, der das neueste und beste Mongo herunterlädt, darauf stoßen wird.
Die Lösung hier ist entweder
1) Verwenden Sie MongoDB V3.4.X (oder 3.5 für diese Angelegenheit, aber es ist eine instabile Entwicklerversion)
ODER
2) Fügen Sie Ihren Modellen die Option usePushEach: true
hinzu, die diese Funktionalität erfordern.
Ich empfehle #1 für Produktions-Apps.
@knutole Diese Lösung hat bei mir gut funktioniert. Mit v3.6
var aSchema = new mongoose.Schema({
...
}, {
usePushEach: true
}
);
Gibt keine Fehler.
Es gibt eine Lösung dafür in der kommenden Version 5.0.0-rc0, verwenden Sie vorerst einfach die Option usePushEach.
Fix funktioniert in der Version 5.0.0-rc2.
Hilfreichster Kommentar
Dies kann die Auswirkungen von Array.push auf $pushAll abmildern. Ich habe es selbst ausprobiert und scheint zu funktionieren.
stattdessen verwenden
@vkarpov15 Die Unterstützung von DocumentDB mit dem Mongo-Protokoll (also nicht DocumentDB wie es ist) wäre fantastisch, auch wenn ich verstehen kann, dass die Projektprioritäten auf Mongo liegen. Leider scheint Microsoft nur eine angemessene Teilmenge der neuesten Mongo-API (3.x) implementiert zu haben, sodass veraltete Inhalte, die aus 2.x stammen, möglicherweise nicht funktionieren.