Mongoose: Falha ao salvar um modelo com erro mongo: MongoError: Modificador desconhecido: $ pushAll

Criado em 23 ago. 2017  ·  27Comentários  ·  Fonte: Automattic/mongoose

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)
needs clarification

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:

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

Todos 27 comentários

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:

  • Mongoose para a versão 4.13.8 ( npm install [email protected] --save ), e
  • MongoDB para 3.4 (você pode verificar a versão digitando db.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.Schema

const 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"

Esta página foi útil?
0 / 5 - 0 avaliações