Mongoose: Ersetzen Sie den veralteten mongodb $pushAll-Operator durch $push + $each

Erstellt am 24. Aug. 2016  ·  13Kommentare  ·  Quelle: Automattic/mongoose

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.

Hilfreichster Kommentar

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.

Alle 13 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen