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)
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:
npm install [email protected] --save
), unddb.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.Schemaconst 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"
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: