Você quer solicitar um recurso ou relatar um bug ?
Reportar um erro
Qual é o comportamento atual?
Teste passando na máquina local, mas falhando no servidor jenkins com exatamente as mesmas versões. A única diferença é local é macos e jenkins é ubuntu, tanto quanto posso dizer.
No MacOS Sierra, node 8.4 e 7.11, mongodb 3.4.7 e mongoose 4.11.7, o teste a seguir passa, mas em nosso servidor jenkins com exatamente as mesmas versões em um servidor ubuntu 16.04 falha.
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);
});
Aqui está o erro exato que estou recebendo:
{
"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
}
editar: Aqui está uma versão mais legível do rastreamento de pilha
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)
você pode fazer mongoose.set('debug', true)
e colar a saída do mongo?
editar: saída mais clara
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}
Pelo que vale a pena, eu verifiquei a saída de depuração em nossos ambientes de desenvolvimento e produção locais e ambos estão usando o modificador $ pushAll com sucesso. O Mongo é instalado a partir dos pacotes oficiais em todos os casos. As máquinas de desenvolvimento são windows e MacOS, as máquinas de produção são Amazon Linux.
Você pode se conectar à sua instância jenkins mongodb usando o shell mongo e verificar a versão usando 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
Você também pode imprimir a versão do servidor usando o comando serverStatus()
usando o 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);
});
});
Por favor, verifique primeiro a sua versão, os pacotes oficiais tendem a ficar desatualizados muito rapidamente.
sim, tem o mesmo erro. tentou passar de 3,2 para 3,5 (sem migração de dados). Eu tenho um campo array
'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}
} ]
},
Eu sei, id
não é o melhor nome de campo, mas funcionou no 3.2. No 3.5, ele falha depois de tentar .save()
o documento após um item ser colocado no array. Eu empurro os itens por meio de .push()
e, em seguida, marco o campo .markModified('liked.item');
. deveria ser simples.
MongoDB 3.5?
sim
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
Bem, isso é um problema, mongodb 3.5 é uma versão dev instável e não deve ser usado. $ pushAll está obsoleto há muito tempo, então talvez eles tenham se livrado dele na versão 3.5. @mbroadst você pode esclarecer?
Adicionamos uma opção usePushEach
para contornar isso há algum tempo: https://github.com/Automattic/mongoose/issues/4455 , que deve ser uma solução alternativa para esse problema:
new Schema({ arr: [String] }, { usePushEach: true });
@ vkarpov15 sim, foi removido para featureCompatibilityVersion=3.6
Touché. Nesse caso, teremos certeza de retirar o # 5670.
Estou tendo exatamente o mesmo problema que estou usando mongodb v3.6 no meu Ubuntu. se pushAll for removido do banco de dados, então como devo salvar a instância ... forneça-me qualquer alternativa
@rankitbishnoi Você pode contornar isso temporariamente adicionando a opção usePushEach
em cada definição de esquema nas opções.
@ vkarpov15 Obrigado pela fantástica biblioteca, senhor.
Eu também estou tendo esse problema com Mongoose 4.13.7 e MongoDB 3.6.0.
ATUALIZAÇÃO: Adicionar usePushEach: true
às opções de esquema para modelos resolveu isso.
@dyladan @chaddjohnson realmente funciona.
muito obrigado!
por favor, como posso fazer isso? como posso adicionar isso às opções de esquema? obrigada!
@ raphaelbp12 Aqui estão os documentos sobre como usar opções de esquema: http://mongoosejs.com/docs/guide.html
Atualizar o esquema não altera esse comportamento. Não está funcionando para dados mais antigos no banco de dados já para 3.6.
Edit: Reverter para a versão 3.4 resolveu o problema.
Eu estava tendo um problema semelhante ao executar o código em minha máquina. Acho que é por causa do Mongoose 5 e do MongoDB 3.6. Tente reverter para trás:
npm install [email protected] --save
), edb.version()
).Funcionou para mim! :)
O Mongoose 5 não deve ser afetado por este problema, ele não usa $pushAll
qualquer lugar. Se você receber este erro com o mongoose 5, abra um problema com os exemplos de código: +1:
PS C: \ Usuários \ paula \ projetos \ apiNode \ src> nó index.js
{MongoError: modificador desconhecido: $ pushAll
em Function.MongoError.create (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ error.js: 31: 11)
em toError (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ utils.js: 139: 22)
em C: \ Usuários \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ collection.js: 1059: 67
em C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ connection \ pool.js: 469: 18
em _combinedTickCallback (internal / process / next_tick.js: 131: 7)
em process._tickCallback (internal / process / next_tick.js: 180: 9)
nome: 'MongoError',
mensagem: 'Modificador desconhecido: $ pushAll',
driver: verdadeiro,
índice: 0,
código: 9
Olá a todos, diga-me como corrigir o erro Modificador desconhecido: $ pushAll
Пробовал вот так не работает
const mongoose = require ('mongoose')
const Схема = mongoose.Schema
const UserSchema = new Schema ({
telegramId: {
tipo: número,
obrigatório: verdadeiro,
usePushEach: true
},
filmes: {
tipo: [String],
predefinição: []
}
})
mongoose.model ('usuários', UserSchema)
@ rivers-lis Você deve adicionar usePushEach
às opções do esquema, não ao esquema, assim:
new Schema({ ... }, { usePushEach: true });
Как то вот так
const mongoose = require ('mongoose')
Const Schema = mongoose.Schema
const UserSchema = new Schema ({
telegramId: {
tipo: número,
requerido: verdadeiro
},
films: {
type: [String],
default: []
}
})
novo Esquema ({}, {usePushEach: true})
mongoose.model ('usuários', UserSchema)
new Schema({ ... }, { usePushEach: true });
Isso resolve o erro para mim também na versão 4.4.12 e 5.0.7
Как то вот так
const mongoose = require ('mongoose')
Const Schema = mongoose.Schemaconst UserSchema = new Schema ({
telegramId: {
tipo: número,
requerido: verdadeiro
},films: { type: [String], default: [] }
})
novo Esquema ({}, {usePushEach: true})
mongoose.model ('usuários', UserSchema)
desculpe, não posso ler russo
@DanGDroid traduzido aproximadamente como "Как то вот так" -> "Algo assim"
Comentários muito úteis
Bem, isso é um problema, mongodb 3.5 é uma versão dev instável e não deve ser usado. $ pushAll está obsoleto há muito tempo, então talvez eles tenham se livrado dele na versão 3.5. @mbroadst você pode esclarecer?
Adicionamos uma opção
usePushEach
para contornar isso há algum tempo: https://github.com/Automattic/mongoose/issues/4455 , que deve ser uma solução alternativa para esse problema: