MongoError: Неизвестный модификатор: $ pushAll в узле js

У меня проблема при сохранении модели с ошибкой mongo: MongoError: Неизвестный модификатор: $ pushAll.

У меня есть subDomains массива в моей схеме и которое будет сохранено по умолчанию с субдоменом, как subDomains ниже.

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

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

Системная информация выглядит следующим образом:

         ➜  ~ 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
          ➜  ~ 

Пожалуйста, помогите мне разобраться в этом.

Ответы

Ответ 1

Оператор $pushAll больше не поддерживается в Mongo 3.6.2 (или любых более новых версиях 3.6. x+).

Вы можете сделать следующее:

Ответ 2

Добавляя к приведенным выше ответам следующий код, чтобы получить ясность в реализации метода concat. Вам не нужно, в частности, понижать MongoDB.

Прежде чем решить эту проблему, вам нужно иметь в виду, что метод $ pushAll устарел долгое время, поэтому, возможно, он избавится от него в версии 3.5 и выше.

Но вы можете решить эту проблему с помощью другого альтернативного метода concat.

Мой старый код,

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

был заменен,

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

Даже реализация Azure собственной MongoDB не поддерживает $ pushAll.

Спасибо.

Ответ 3

В случае, если кто-то новый наткнется на это, из mongoose 5xx, поддержка usePushEach: true опция в определении схемы была удалена

Вместо этого вы должны использовать concat() где вы обычно используете push при добавлении объектов. В случаях, когда concat() не работает (пример, где $inc вызывается явно или неявно) используйте unshift().

Ответ 4

Я использую "mongoose": "^ 4.12.1", и использование.push вызывало ту же ошибку. Использование usePushEach работает для меня. Мы можем включить его для всех схем, подобных этому:

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

Ответ 5

Замена .push на .unshift - лучший способ справиться с этой ошибкой. Надеюсь, это может сэкономить ваш день.

Ответ 6

Если вы используете> 3.6 Это не работает. Но если вы хотите, чтобы это работало, вы можете использовать $push вместе с $each это работало.

Ответ 7

пытаться

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

это работает для меня

Ответ 8

использовать concat решить проблему

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