web-dev-qa-db-fra.com

MongoError: modificateur inconnu: $ pushAll dans le noeud js

J'ai un problème lorsque l'enregistrement d'un modèle échoue avec erreur mongo: MongoError: inconnu modificateur: $ pushAll .

J'ai un champ de tableau subDomains dans mon schéma et qui sera enregistré par défaut avec le sous-domaine comme suit.

 // already Domain instance get availble 
 Domain.subDomains.Push({'name': 'default' , 'role': 'xyz', ...});

 // save domain with default fileds
 Domain.save() 

Informations système comme suit:

         ➜  ~ node --version
          v9.4.0
          ➜  ~ npm --version
          5.6.0
          ➜  ~ 
          ➜  ~ mongo --version
            MongoDB Shell version v3.6.2
            git version: ......
            OpenSSL version: OpenSSL 1.0.2n  7 Dec 2017
            allocator: system
            modules: none
            build environment:
                distarch: x86_64
                target_Arch: x86_64
          ➜  ~ 

S'il vous plaît, aidez-moi à régler celui-ci.

9
Santosh Shinde

L'opérateur $pushAll n'est plus pris en charge dans Mongo 3.6.2 (ni dans les versions plus récentes à partir de 3.6.x +). 

Vous pouvez faire ce qui suit:

21
Teodor Kurtev

Ajouter aux réponses ci-dessus avec le code suivant pour vous aider à comprendre la méthode concat. Vous n'avez pas besoin de rétrograder MongoDB en particulier.

Avant de résoudre ce problème, vous devez garder à l’esprit que la méthode $ pushAll est obsolète depuis longtemps. Ils peuvent donc s’en débarrasser dans les versions 3.5 et supérieures.

Mais vous pouvez résoudre ce problème avec l'autre méthode alternative - concat.

Mon ancien code,

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

a été remplacé par

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

Même la propre implémentation de MongoDB d’Azure ne prend pas en charge $ pushAll.

Je vous remercie.

12
Balasubramani M

Au cas où quelqu'un de nouveau tomberait dessus, à partir de mongoose 5xx , le support de l'option usePushEach: true dans la définition du schéma a été supprimé

Vous devez plutôt utiliser concat() là où vous utiliseriez normalement Push lors de l'ajout d'objets . Dans les cas où concat() ne fonctionne pas (exemple où $inc est appelé explicitement ou implicitement), utilisez unshift().

6
Nnanyielugo

J'utilise "mangouste": "^ 4.12.1" et l'utilisation de .Push provoquait la même erreur. L’utilisation de usePushEach fonctionne pour moi. Nous pouvons l'activer pour tous les schémas suivants:

const mongoose = require('mongoose');
mongoose.plugin(schema => { schema.options.usePushEach = true });
const Schema = mongoose.Schema; 
const SampleSchema = new Schema({
    attr1: type,
    attr2: type,
    attr2: type,
    attr4: [{
        type: Schema.Types.ObjectId,
        ref: 'ref_table_name'
    }] });
4
brax7

Si vous utilisez> 3.6 Cela ne fonctionne pas . Vous pouvez utiliser $Push avec $each, cela fonctionnera.

1
Nilesh Patel

Remplacer .Push par .unshift est le meilleur moyen de remédier à cette erreur . J'espère que cela vous sauvera la journée.

0
Lalit Sunar

essayer 

Domain._doc.subDomains.Push({'name': 'default' , 'role': 'xyz', ...});

ça marche pour moi

0
Omega Cube