it-swarm.com.de

MongoError: Unbekannter Modifikator: $ pushAll im Knoten js

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.

9
Santosh Shinde

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:

21
Teodor Kurtev

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.

12
Balasubramani M

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().

6
Nnanyielugo

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'
    }] });
4
brax7

Wenn Sie> 3.6 verwenden, funktioniert es nicht . Sie können $Push zusammen mit $each verwenden.

1
Nilesh Patel

Das Ersetzen von .Push durch .unshift ist der beste Weg, um diesen Fehler zu beheben.

0
Lalit Sunar

benutze concat um das problem zu lösen

 var newArray=  Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}]) 
      Domain.subDomains=newArray
      Domain.save()
0
Govan

versuchen 

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

das funktioniert für mich

0
Omega Cube