Вы хотите запросить функцию или сообщить об ошибке ?
Сообщить об ошибке
Каково текущее поведение?
Тест проходит на локальной машине, но не проходит на сервере 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)
вы можете сделать 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. Попробуйте вернуться назад:
npm install [email protected] --save
) и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.Schemaconst UserSchema = новая схема ({
telegramId: {
тип: Число,
требуется: правда
},films: { type: [String], default: [] }
})
новая схема ({}, {usePushEach: true})
mongoose.model ('пользователи', UserSchema)
извините не могу читать по русски
@DanGDroid примерно перевел "Как то вот так" -> "Что-то вроде этого"
Самый полезный комментарий
Что ж, это одна проблема, mongodb 3.5 - это нестабильная версия для разработчиков, и ее не следует использовать. $ pushAll давно устарел, поэтому, возможно, они избавились от него в версии 3.5. @mbroadst можете уточнить?
Некоторое время назад мы добавили опцию
usePushEach
чтобы обойти эту проблему: https://github.com/Automattic/mongoose/issues/4455 , это должно быть обходным путем для этой проблемы: