Mongoose: Не удается сохранить модель с ошибкой mongo: MongoError: Unknown modifier: $ pushAll

Созданный на 23 авг. 2017  ·  27Комментарии  ·  Источник: Automattic/mongoose

Вы хотите запросить функцию или сообщить об ошибке ?

Сообщить об ошибке

Каково текущее поведение?

Тест проходит на локальной машине, но не проходит на сервере jenkins с теми же версиями. Единственная разница в том, что локально это macos, а jenkins - это ubuntu, насколько я могу судить.

В MacOS Sierra, node 8.4 и 7.11, mongodb 3.4.7 и mongoose 4.11.7 следующий тест проходит, но на нашем сервере jenkins с точно такими же версиями на сервере ubuntu 16.04 происходит сбой.

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

Вот точная ошибка, которую я получаю:

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

изменить: вот более читаемая версия трассировки стека

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

Самый полезный комментарий

Что ж, это одна проблема, mongodb 3.5 - это нестабильная версия для разработчиков, и ее не следует использовать. $ pushAll давно устарел, поэтому, возможно, они избавились от него в версии 3.5. @mbroadst можете уточнить?

Некоторое время назад мы добавили опцию usePushEach чтобы обойти эту проблему: https://github.com/Automattic/mongoose/issues/4455 , это должно быть обходным путем для этой проблемы:

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

Все 27 Комментарий

вы можете сделать mongoose.set('debug', true) и вставить вывод монго?

изменить: более четкий вывод

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}

Как бы то ни было, я проверил отладочные данные в наших локальных средах разработки и производства, и они оба успешно используют модификатор $ pushAll. Mongo во всех случаях устанавливается из официальных пакетов. Машины для разработки - это Windows и MacOS, производственные машины - это amazon linux.

Можете ли вы подключиться к своему экземпляру jenkins mongodb с помощью оболочки mongo и дважды проверить версию с помощью db.version ?

$ 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

Вы также можете распечатать версию сервера с помощью команды serverStatus() используя mongoose:

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

Пожалуйста, сначала дважды проверьте свою версию, официальные пакеты, как правило, довольно быстро устаревают.

да, есть такая же ошибка. пробовал перейти с 3.2 на 3.5 (без переноса данных). У меня есть поле массива

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

Я знаю, id - не лучшее имя поля, но эй, оно работало в 3.2. В версии 3.5 он терпит неудачу после попытки .save() документа после того, как элемент был помещен в массив. Я проталкиваю элементы через .push() и затем отмечаю поле .markModified('liked.item'); . должно быть просто.

MongoDB 3.5?

да

 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

Что ж, это одна проблема, mongodb 3.5 - это нестабильная версия для разработчиков, и ее не следует использовать. $ pushAll давно устарел, поэтому, возможно, они избавились от него в версии 3.5. @mbroadst можете уточнить?

Некоторое время назад мы добавили опцию usePushEach чтобы обойти эту проблему: https://github.com/Automattic/mongoose/issues/4455 , это должно быть обходным путем для этой проблемы:

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

@ vkarpov15 да, он был удален за featureCompatibilityVersion=3.6

Туш. В этом случае мы обязательно получим # 5670.

У меня такая же проблема, как я использую mongodb v3.6 на моем Ubuntu. если pushAll удален из базы данных, чем мне следует сохранить экземпляр ... пожалуйста, предоставьте мне любую альтернативу

@rankitbishnoi Вы можете временно обойти это, добавив параметр usePushEach в каждое определение схемы в параметрах.

@ vkarpov15 Спасибо за фантастическую библиотеку, сэр.

У меня тоже возникла эта проблема с Mongoose 4.13.7 и MongoDB 3.6.0.

ОБНОВЛЕНИЕ: добавление usePushEach: true в параметры схемы для моделей решило эту проблему.

@dyladan @chaddjohnson действительно работает.
большое спасибо!

пожалуйста, как я могу это сделать? как я могу добавить это в параметры схемы? благодарю вас!

@ raphaelbp12 Вот документы по использованию параметров схемы: http://mongoosejs.com/docs/guide.html

Обновление схемы не меняет этого поведения. Это не работает для старых данных в базе данных уже для версии 3.6.

Изменить: возврат к версии 3.4 решил проблему.

У меня была аналогичная проблема с запуском кода на моем компьютере. Я думаю, это из-за Mongoose 5 и MongoDB 3.6. Попробуйте вернуться назад:

  • Mongoose до версии 4.13.8 ( npm install [email protected] --save ) и
  • MongoDB до 3.4 (вы можете проверить версию, набрав db.version() ).

У меня это сработало! :)

Эта проблема не должна затрагивать Mongoose 5, он нигде не использует $pushAll . Если вы получаете эту ошибку с mongoose 5, пожалуйста, откройте проблему с примерами кода: +1:

PS C: \ Users \ paula \ projetos \ apiNode \ src> узел index.js
{MongoError: Неизвестный модификатор: $ pushAll
в Function.MongoError.create (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ error.js: 31: 11)
в toError (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ utils.js: 139: 22)
в C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ collection.js: 1059: 67
в C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ connection \ pool.js: 469: 18
в _combinedTickCallback (внутренний / процесс / next_tick.js: 131: 7)
в process._tickCallback (внутренний / процесс / next_tick.js: 180: 9)
name: 'MongoError',
message: 'Неизвестный модификатор: $ pushAll',
водитель: правда,
индекс: 0,
код: 9

Всем привет, подскажите пожалуйста как исправить ошибку Неизвестный модификатор: $ pushAll

Пробовал вот так не работает
const mongoose = require ('мангуст')
const Схема = mongoose.Schema

const UserSchema = новая схема ({
telegramId: {
тип: Число,
требуется: true,
usePushEach: правда
},

фильмы: {
тип: [String],
дефолт: []
}
})

mongoose.model ('пользователи', UserSchema)

@ River-lis Вы должны добавить usePushEach в параметры схемы, а не в схему, например:

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

Как то вот так
const mongoose = require ('мангуст')
const Схема = mongoose.Schema

const UserSchema = новая схема ({
telegramId: {
тип: Число,
требуется: правда
},

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

})

новая схема ({}, {usePushEach: true})

mongoose.model ('пользователи', UserSchema)

new Schema({ ... }, { usePushEach: true });
Это решает ошибку и для меня в версиях 4.4.12 и 5.0.7.

Как то вот так
const mongoose = require ('мангуст')
const Схема = mongoose.Schema

const UserSchema = новая схема ({
telegramId: {
тип: Число,
требуется: правда
},

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

})

новая схема ({}, {usePushEach: true})

mongoose.model ('пользователи', UserSchema)

извините не могу читать по русски

@DanGDroid примерно перевел "Как то вот так" -> "Что-то вроде этого"

Была ли эта страница полезной?
0 / 5 - 0 рейтинги