Mongoose: L'enregistrement d'un modèle échoue avec l'erreur mongo : MongoError : Modificateur inconnu : $pushAll

Créé le 23 août 2017  ·  27Commentaires  ·  Source: Automattic/mongoose

Vous souhaitez demander une fonctionnalité ou signaler un bug ?

Signaler un bug

Quel est le comportement actuel ?

Test de réussite sur la machine locale mais échec sur le serveur jenkins avec exactement les mêmes versions. La seule différence est locale est macos et jenkins est ubuntu pour autant que je sache.

Sur MacOS Sierra, les nœuds 8.4 et 7.11, mongodb 3.4.7 et mongoose 4.11.7, le test suivant réussit, mais sur notre serveur jenkins avec exactement les mêmes versions sur un serveur ubuntu 16.04 échoue.

  it("should successfully allow an alias that matches a service", async () => {
    const aliasTag = "this is a test";
    const appAlias = await AliasController.create(user, appAliasSpec);
    const serviceAlias = await AliasController.create(user, serviceAliasSpec);

    appAlias.aliases.push(aliasTag);
    await appAlias.save(); // This is the line that fails in jenkins

    serviceAlias.aliases.push(aliasTag);
    await serviceAlias.save();

    const confAppAlias = await AliasController.getById(appAlias._id);
    const confServiceAlias = await AliasController.getById(serviceAlias._id);
    expect(confAppAlias.aliases[1]).to.equal(aliasTag);
    expect(confServiceAlias.aliases[1]).to.equal(aliasTag);
  });

Voici l'erreur exacte que j'obtiens :

{
    "message": "Unknown modifier: $pushAll",
    "name": "MongoError",
    "stack": "MongoError: Unknown modifier: $pushAll\n    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)\n    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18\n    at _combinedTickCallback (internal/process/next_tick.js:131:7)\n    at process._tickCallback (internal/process/next_tick.js:180:9)",
    "code": 9
}

edit : voici une version plus lisible de la trace de la pile

MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
needs clarification

Commentaire le plus utile

Eh bien, c'est un problème, mongodb 3.5 est une version de développement instable et ne doit pas être utilisée. $pushAll est obsolète depuis longtemps, alors peut-être qu'ils l'ont supprimé dans la version 3.5. @mbroadst pouvez-vous clarifier?

Nous avons ajouté une option usePushEach pour contourner ce problème il y a quelque temps : https://github.com/Automattic/mongoose/issues/4455 , cela devrait être une solution de contournement pour ce problème :

new Schema({ arr: [String] }, { usePushEach: true });

Tous les 27 commentaires

pouvez-vous faire mongoose.set('debug', true) et coller la sortie mongo ?

edit: sortie plus claire

Mongoose: aliases.update({ _id: ObjectId("599d98122b72d12e0ba858b4") }, { '$pushAll': { aliases: [ 'this is a test' ] }, '$set': { updatedAt: new Date("Wed, 23 Aug 2017 14:58:26 GMT") }, '$inc': { __v: 1 } })
{"name":"davis","hostname":"ld-ub-bm980a98v","pid":11787,"level":50,"err":{"message":"Unknown modifier: $pushAll","name":"MongoError","stack":"MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)","code":9},"msg":"An unhandled Mongo error occurred.","time":"2017-08-23T14:58:26.201Z","v":0}

Pour ce que ça vaut, j'ai vérifié la sortie de débogage dans nos environnements de développement et de production locaux et ils utilisent tous les deux le modificateur $ pushAll avec succès. Mongo est installé à partir des packages officiels dans tous les cas. Les machines de développement sont Windows et MacOS, les machines de production sont Amazon Linux.

Pouvez-vous vous connecter à votre instance jenkins mongodb à l'aide du shell mongo et vérifier la version à l'aide de db.version ?

$ mongo test
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.1 
> db.version()
3.4.1
> ^C
bye

Vous pouvez également imprimer la version du serveur à l'aide de la commande serverStatus() utilisant mongoose :

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test');

mongoose.connection.on('open', function() {
  mongoose.connection.db.admin().serverStatus(function(error, info) {
    console.log(info.version);
  });
});

Veuillez d'abord vérifier votre version, les packages officiels ont tendance à devenir obsolètes assez rapidement.

oui, j'ai la même erreur. essayé de passer de 3.2 à 3.5 (pas de migration de données). j'ai un champ tableau

    'liked': {
        'item':[ {
            'id': {'type': Types.ObjectId, 'ref': 'Item'},
            'score': {'type': Number, 'max': 100, 'default': -1},
            'comment': {'type': String, 'maxlength': 65000, 'trim': true, 'default': '', 'set': san.methods.safe}
        } ]
    },

Je sais, id n'est pas le meilleur nom de champ, mais bon, cela a fonctionné en 3.2. Dans 3.5, il échoue après avoir essayé de .save() le document après qu'un élément a été poussé dans le tableau. Je pousse les éléments via .push() puis marque le champ .markModified('liked.item'); . devrait être simple.

MongoDB 3.5 ?

Oui

 targetMinOS: Windows 7/Windows Server 2008 R2
 db version v3.5.13
 git version: 52bbaa007cd84631d6da811d9a05b59f2dfad4f3
 OpenSSL version: OpenSSL 1.0.1u-fips  22 Sep 2016
 allocator: tcmalloc
 modules: none
 build environment:
     distmod: 2008plus-ssl
     distarch: x86_64
     target_arch: x86_64

Eh bien, c'est un problème, mongodb 3.5 est une version de développement instable et ne doit pas être utilisée. $pushAll est obsolète depuis longtemps, alors peut-être qu'ils l'ont supprimé dans la version 3.5. @mbroadst pouvez-vous clarifier?

Nous avons ajouté une option usePushEach pour contourner ce problème il y a quelque temps : https://github.com/Automattic/mongoose/issues/4455 , cela devrait être une solution de contournement pour ce problème :

new Schema({ arr: [String] }, { usePushEach: true });

@vkarpov15 oui, il a été supprimé pour featureCompatibilityVersion=3.6

Touche. Dans ce cas, nous nous assurerons de sortir le #5670.

J'ai exactement le même problème que j'utilise mongodb v3.6 sur mon Ubuntu. si le pushAll est supprimé de la base de données, comment dois-je enregistrer l'instance .. veuillez me fournir une alternative

@rankitbishnoi Vous pouvez contourner cela temporairement en ajoutant l'option usePushEach sur chaque définition de schéma dans les options.

@ vkarpov15 Merci pour la fantastique bibliothèque monsieur.

Moi aussi, je rencontre ce problème avec Mongoose 4.13.7 et MongoDB 3.6.0.

MISE À JOUR : L'ajout de usePushEach: true aux options de schéma pour les modèles a résolu ce problème.

@dyladan @chaddjohnson fonctionne vraiment.
Merci beaucoup!

s'il vous plaît, comment puis-je faire cela? comment puis-je ajouter cela aux options de schéma? Merci!

@raphaelbp12 Voici la documentation sur l'utilisation des options de schéma : http://mongoosejs.com/docs/guide.html

La mise à jour du schéma ne modifie pas ce comportement. Cela ne fonctionne pas pour les données plus anciennes dans la base de données déjà pour 3.6.

Edit : le retour à la version 3.4 a résolu le problème.

J'avais un problème similaire en exécutant le code sur ma machine. Je pense que c'est à cause de Mongoose 5 et MongoDB 3.6. Essayez de revenir en arrière :

  • Mangouste à la version 4.13.8 ( npm install [email protected] --save ), et
  • MongoDB à 3.4 (vous pouvez vérifier la version en tapant db.version() ).

ça a marché pour moi ! :)

Mongoose 5 ne devrait pas être affecté par ce problème, il n'utilise $pushAll nulle part. Si vous obtenez cette erreur avec mongoose 5, veuillez ouvrir un problème avec des exemples de code :+1 :

PS C:\Users\paula\projetos\apiNode\src> node index.js
{ MongoError : Modificateur inconnu : $pushAll
à Function.MongoError.create (C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\error.js:31:11)
à toError (C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\utils.js:139:22)
à C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\collection.js:1059:67
à C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\connection\pool.js:469:18
à _combinedTickCallback (interne/processus/next_tick.js:131:7)
à process._tickCallback (interne/process/next_tick.js:180:9)
nom : 'MongoError',
message : « Modificateur inconnu : $pushAll »,
pilote : vrai,
indice : 0,
code : 9

Bonjour à tous, dites-moi comment corriger l'erreur Modificateur inconnu : $ pushAll

робовал вот так не работает
const mangouste = require ('mangouste')
const Схема = mangouste.Schéma

const UserSchema = nouveau schéma ({
Id de télégramme : {
tapez : nombre,
requis : vrai,
usePushEach : vrai
},

films : {
tapez : [Chaîne],
défaut: []
}
})

mongoose.model ('users', UserSchema)

@rivers-lis Vous devez ajouter usePushEach aux options du schéma, pas au schéma, comme ceci :

new Schema({ ... }, { usePushEach: true });

ак то вот так
const mangouste = require('mangouste')
const Schéma = mangouste.Schéma

const UserSchema = new Schema({
Id de télégramme : {
tapez : nombre,
requis : vrai
},

films: {
    type: [String],
    default: []
}

})

nouveau schéma ({}, {usePushEach : true})

mongoose.model('users', UserSchema)

new Schema({ ... }, { usePushEach: true });
Cela résout l'erreur pour moi aussi sur les versions 4.4.12 et 5.0.7

ак то вот так
const mangouste = require('mangouste')
const Schéma = mangouste.Schéma

const UserSchema = new Schema({
Id de télégramme : {
tapez : nombre,
requis : vrai
},

films: {
    type: [String],
    default: []
}

})

nouveau schéma ({}, {usePushEach : true})

mongoose.model('users', UserSchema)

désolé ne peut pas lire le russe

@DanGDroid traduit grossièrement "Как то вот так" -> "Quelque chose comme ça"

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