Mongoose: Remplacer l'opérateur obsolète mongodb $pushAll par $push + $each

Créé le 24 août 2016  ·  13Commentaires  ·  Source: Automattic/mongoose

Selon la documentation de MongoDB, $pushAll est obsolète depuis la version 2.4. Cependant, il reste l'opérateur dans lequel Array#push se traduit.

En supposant qu'il ne s'agisse pas d'un changement de rupture, je pense que ce serait une solution pratique, car certaines implémentations peuvent ne pas s'appuyer sur $pushAll . En fait, pour ce que cela vaut, l'implémentation MongoDB d'Azure ne prend pas en charge l'opérateur $pushAll AFAIK .

Commentaire le plus utile

Cela peut atténuer l'impact de Array.push en s'appuyant sur $pushAll. Je l'ai essayé moi-même et semble fonctionner.

myArray.push(myObject); //breaks on DocumentDB with Mongo API because of $pushAll

utilisez plutôt

myArray = myArray.concat([myObject]); //this uses $set so no problems

@ vkarpov15 Prendre en charge DocumentDB avec le protocole Mongo (donc pas DocumentDB tel qu'il est) serait fantastique, même si je peux comprendre que les priorités du projet sont sur Mongo. Malheureusement, Microsoft semble n'avoir implémenté qu'un sous-ensemble équitable de la dernière API Mongo (3.x), donc les éléments obsolètes provenant de 2.x peuvent ne pas fonctionner.

Tous les 13 commentaires

Sortir de pushAll est définitivement une priorité, mais juste avertissement, mongoose ne supporte _pas_ documentdb pour le moment, alors utilisez-le à vos risques et périls

Cela peut atténuer l'impact de Array.push en s'appuyant sur $pushAll. Je l'ai essayé moi-même et semble fonctionner.

myArray.push(myObject); //breaks on DocumentDB with Mongo API because of $pushAll

utilisez plutôt

myArray = myArray.concat([myObject]); //this uses $set so no problems

@ vkarpov15 Prendre en charge DocumentDB avec le protocole Mongo (donc pas DocumentDB tel qu'il est) serait fantastique, même si je peux comprendre que les priorités du projet sont sur Mongo. Malheureusement, Microsoft semble n'avoir implémenté qu'un sous-ensemble équitable de la dernière API Mongo (3.x), donc les éléments obsolètes provenant de 2.x peuvent ne pas fonctionner.

En 4.6.4, vous pourrez utiliser l'option usePushEach dans les schémas : new Schema({ arr: [String] }, { usePushEach: true });

J'ai commencé à rencontrer ce problème sur Mongo 3.6 et Mongoose 4.13.6, message: 'Unknown modifier: $pushAll',

Le correctif suggéré ne fonctionne pas :

var layerSchema = mongoose.Schema({
   (...) 
}, 
{ 
    usePushEach: true 
});

C'est bizarre que ce soit toujours un problème avec les bibliothèques mises à jour ?

Identique à Knutole ici, je crée des modèles avec mangouste et je ne sais pas si / où je peux brancher ce correctif.

Cette suggestion résout le problème dans mongodb 3.6 pour moi.

Édition 1 :
Oubliez, ça n'a pas marché ici aussi.

Édition 2 :
La solution était de continuer à fonctionner sur mongo 3.4

Même problème ici avec Mongo 3.6
Tout push et save on array field génère l'erreur : Modificateur inconnu : $pushAll
En utilisant le dernier Mongoose aussi...

La solution de contournement usePushEach: true semble fonctionner pour nous. MongoDB 3.6 + db.adminCommand({ setFeatureCompatibilityVersion: "3.6" })

@knutole quel problème rencontrez-vous ? Cette solution a fonctionné pour moi. @frguthmann le pari le plus sûr serait d'ajouter cette ligne à tous les modèles si vous utilisez MongoDB 3.6+.

Mongo 3.6 a été récemment publié et a supprimé la prise en charge de $pushAll , de sorte que tous ceux qui téléchargent le dernier et le meilleur mongo se heurteront à cela.

La solution ici est soit

1) Utilisez MongoDB V3.4.X (ou 3.5 d'ailleurs, mais c'est une version de développement instable)

OU

2) ajoutez l'option usePushEach: true à vos modèles qui nécessiteront cette fonctionnalité.

Je recommande #1 pour les applications de production.

@knutole Cette solution a bien fonctionné pour moi. Utilisation de la v3.6

var aSchema = new mongoose.Schema({
    ...
}, {
        usePushEach: true 
    }
);

Ne donne aucune erreur.

Il y a un correctif pour cela dans la prochaine version 5.0.0-rc0, pour l'instant utilisez simplement l'option usePushEach.

Le correctif fonctionne dans la version 5.0.0-rc2.

Cette page vous a été utile?
0 / 5 - 0 notes