Ich habe ein Problem, wenn das Speichern eines Modells mit dem Fehler " mongo" fehlschlägt: MongoError: Unknown Modifier: $ pushAll .
Ich habe ein Arrayfeld subDomains
in meinem Schema, das wie folgt standardmäßig mit der Subdomain gespeichert wird.
// already Domain instance get availble
Domain.subDomains.Push({'name': 'default' , 'role': 'xyz', ...});
// save domain with default fileds
Domain.save()
Systeminfo wie folgt:
➜ ~ 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
➜ ~
Bitte helfen Sie mir, dieses zu klären.
Der $pushAll
-Operator wird in Mongo 3.6.2 (oder neueren Versionen von 3.6.x +) nicht mehr unterstützt.
Sie können Folgendes tun:
usePushEach: true
der Schemadefinition hinzu.Hinzufügen der obigen Antworten mit dem folgenden Code, um die Implementierung der concat -Methode zu erleichtern. Sie müssen MongoDB nicht besonders herunterstufen.
Bevor Sie dieses Problem lösen, müssen Sie bedenken, dass die Methode $ pushAll seit langem nicht mehr verwendet wird, sodass sie in Version 3.5 und höher möglicherweise entfernt wird.
Sie können dieses Problem jedoch mit der anderen Alternative - concat - Methode beheben.
Mein alter Code
myArray.Push(id); //breaks on DocumentDB with Mongo API because of $pushAll
wurde ersetzt durch
myArray = myArray.concat([id]); //this uses $set so no problems
Selbst die eigene MongoDB-Implementierung von Azure unterstützt $ pushAll nicht.
Vielen Dank.
Für den Fall, dass jemand Neues über diese Option stolpert, wurde die Unterstützung für die Option usePushEach: true
in der Schemadefinition von mongoose 5xx entfernt
Verwenden Sie stattdessen concat()
, wo Sie normalerweise Push verwenden, wenn Sie Objekte anhängen. In Fällen, in denen concat()
nicht funktioniert (Beispiel, wenn $inc
entweder explizit oder implizit aufgerufen wird), verwenden Sie unshift()
.
Ich verwende "Mungo": "^ 4.12.1" und die Verwendung von .Push warf den gleichen Fehler. Die Verwendung von usePushEach
funktioniert für mich. Wir können es für alle Schemata wie folgt aktivieren:
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'
}] });
Wenn Sie> 3.6 verwenden, funktioniert es nicht . Sie können $Push
zusammen mit $each
verwenden.
Das Ersetzen von .Push
durch .unshift
ist der beste Weg, um diesen Fehler zu beheben.
benutze concat um das problem zu lösen
var newArray= Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}])
Domain.subDomains=newArray
Domain.save()
versuchen
Domain._doc.subDomains.Push({'name': 'default' , 'role': 'xyz', ...});
das funktioniert für mich