Mongoose: Das Speichern eines Modells schlägt mit dem Mongo-Fehler fehl: MongoError: Unbekannter Modifikator: $pushAll

Erstellt am 23. Aug. 2017  ·  27Kommentare  ·  Quelle: Automattic/mongoose

Möchten Sie eine Funktion anfordern oder einen Fehler melden?

Melde einen technischen Fehler

Wie ist das aktuelle Verhalten?

Testen Sie das Bestehen auf dem lokalen Computer, schlagen Sie jedoch auf dem Jenkins-Server mit genau den gleichen Versionen fehl. Der einzige Unterschied ist, dass lokal Macos ist und Jenkins Ubuntu ist, soweit ich das beurteilen kann.

Auf MacOS Sierra, Knoten 8.4 und 7.11, mongodb 3.4.7 und mongoose 4.11.7 besteht der folgende Test, aber auf unserem Jenkins-Server mit genau den gleichen Versionen auf einem Ubuntu 16.04-Server schlägt er fehl.

  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);
  });

Hier ist der genaue Fehler, den ich bekomme:

{
    "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
}

Bearbeiten: Hier ist eine besser lesbare Version des Stack-Trace

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

Hilfreichster Kommentar

Nun, das ist ein Problem, mongodb 3.5 ist eine instabile Entwicklerversion und sollte nicht verwendet werden. $pushAll ist seit langem veraltet, vielleicht wurde es in 3.5 entfernt. @mbroadst kannst du das klären?

Wir haben vor einiger Zeit eine Option usePushEach hinzugefügt, um dies zu umgehen: https://github.com/Automattic/mongoose/issues/4455 , das sollte eine Problemumgehung für dieses Problem sein:

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

Alle 27 Kommentare

können Sie mongoose.set('debug', true) tun und die Mongo-Ausgabe einfügen?

edit: klarere Ausgabe

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}

Ich habe die Debug-Ausgabe in unseren lokalen Entwicklungs- und Produktionsumgebungen überprüft, und beide verwenden erfolgreich den $pushAll-Modifikator. Mongo wird in allen Fällen aus den offiziellen Paketen installiert. Entwicklungsmaschinen sind Windows und MacOS, Produktionsmaschinen sind Amazon Linux.

Können Sie mit der Mongo-Shell eine Verbindung zu Ihrer Jenkins-Mongodb-Instanz herstellen und die Version mit db.version überprüfen?

$ 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

Sie können die Serverversion auch mit dem Befehl serverStatus() mit mungo ausdrucken:

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);
  });
});

Bitte überprüfen Sie zuerst Ihre Version, offizielle Pakete neigen dazu, ziemlich schnell veraltet zu sein.

ja, habe den gleichen Fehler. versucht, von 3.2 auf 3.5 zu wechseln (keine Datenmigration). Ich habe ein Array-Feld

    '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}
        } ]
    },

Ich weiß, id ist nicht der beste Feldname, aber hey, in 3.2 hat es funktioniert. In 3.5 schlägt es fehl, nachdem versucht wurde, das Dokument .save() erstellen, nachdem ein Element in das Array verschoben wurde. Ich schiebe die Items über .push() und markiere dann das Feld .markModified('liked.item'); . sollte einfach sein.

MongoDB 3.5?

Jawohl

 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

Nun, das ist ein Problem, mongodb 3.5 ist eine instabile Entwicklerversion und sollte nicht verwendet werden. $pushAll ist seit langem veraltet, vielleicht wurde es in 3.5 entfernt. @mbroadst kannst du das klären?

Wir haben vor einiger Zeit eine Option usePushEach hinzugefügt, um dies zu umgehen: https://github.com/Automattic/mongoose/issues/4455 , das sollte eine Problemumgehung für dieses Problem sein:

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

@vkarpov15 ja, es wurde für featureCompatibilityVersion=3.6

Berühren. In diesem Fall sorgen wir dafür, dass #5670 rauskommt.

Ich habe genau das gleiche Problem, das ich mit mongodb v3.6 auf meinem Ubuntu verwende. Wenn die pushAll aus db entfernt wird, wie soll ich die Instanz speichern? Bitte geben Sie mir eine Alternative?

@rankitbishnoi Sie können dies vorübergehend usePushEach zu jeder Schemadefinition in den Optionen hinzufügen.

@vkarpov15 Danke für die fantastische Bibliothek, Sir.

Auch ich habe dieses Problem mit Mongoose 4.13.7 und MongoDB 3.6.0.

UPDATE: Das Hinzufügen von usePushEach: true zu den Schemaoptionen für Modelle hat dieses Problem behoben.

@dyladan @chaddjohnson funktioniert wirklich.
Danke vielmals!

bitte, wie kann ich das tun? Wie kann ich dies zu den Schemaoptionen hinzufügen? Danke schön!

@raphaelbp12 Hier sind die Dokumente zur Verwendung von http://mongoosejs.com/docs/guide.html

Das Aktualisieren des Schemas ändert dieses Verhalten nicht. Es funktioniert nicht für ältere Daten in der Datenbank bereits für 3.6.

Bearbeiten: Das Zurücksetzen auf Version 3.4 hat das Problem behoben.

Ich hatte ein ähnliches Problem beim Ausführen des Codes auf meinem Computer. Ich denke, es liegt an Mongoose 5 und MongoDB 3.6. Versuchen Sie, zurückzukehren:

  • Mungo auf Version 4.13.8 ( npm install [email protected] --save ), und
  • MongoDB auf 3.4 (Sie können die Version überprüfen, indem Sie db.version() eingeben).

Bei mir hat es funktioniert! :)

Mongoose 5 sollte von diesem Problem nicht betroffen sein, es verwendet nirgendwo $pushAll . Wenn Sie diesen Fehler mit Mungo 5 erhalten, öffnen Sie bitte ein Problem mit Codebeispielen :+1:

PS C:\Users\paula\projetos\apiNode\src> node index.js
{ MongoError: Unbekannter Modifikator: $pushAll
at Function.MongoError.create (C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\error.js:31:11)
at toError (C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\utils.js:139:22)
unter C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\collection.js:1059:67
unter C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\connection\pool.js:469:18
bei _combinedTickCallback (intern/process/next_tick.js:131:7)
at process._tickCallback (intern/process/next_tick.js:180:9)
Name: 'MongoFehler',
Nachricht: 'Unbekannter Modifikator: $pushAll',
Fahrer: wahr,
Index: 0,
Code: 9

Hallo zusammen, bitte sagen Sie mir, wie Sie den Fehler Unbekannter Modifikator beheben können: $ pushAll

робовал вот так не работает
const Mungo = erfordern ("Mungo")
const Схема = mongoose.Schema

const UserSchema = neues Schema ({
telegramId: {
Nummer eingeben,
erforderlich: wahr,-
usePushEach: true
},

Filme: {
Typ: [Zeichenfolge],
Ursprünglich: []
}
})

mongoose.model ('Benutzer', UserSchema)

@rivers-lis Sie müssen usePushEach zu den Schemaoptionen hinzufügen, nicht zum Schema, wie folgt:

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

ак то вот так
const Mungo = erfordern('Mungo')
const Schema = mongoose.Schema

const UserSchema = new Schema({
telegramId: {
Nummer eingeben,
erforderlich: wahr
},

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

})

neues Schema({}, {usePushEach: true})

mongoose.model('users', UserSchema)

new Schema({ ... }, { usePushEach: true });
Das behebt den Fehler auch bei mir auf Version 4.4.12 und 5.0.7

ак то вот так
const Mungo = erfordern('Mungo')
const Schema = mongoose.Schema

const UserSchema = new Schema({
telegramId: {
Nummer eingeben,
erforderlich: wahr
},

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

})

neues Schema({}, {usePushEach: true})

mongoose.model('users', UserSchema)

Entschuldigung kann kein Russisch lesen

@DanGDroid übersetzt grob "Как то вот так" -> "So etwas in der Art"

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen