Mongoose: Menyimpan model gagal dengan kesalahan mongo: MongoError: Pengubah tidak dikenal: $pushAll

Dibuat pada 23 Agu 2017  ·  27Komentar  ·  Sumber: Automattic/mongoose

Apakah Anda ingin meminta fitur atau melaporkan bug ?

Laporkan bug

Apa perilaku saat ini?

Tes lulus di mesin lokal tetapi gagal di server jenkins dengan versi yang sama persis. Satu-satunya perbedaan adalah lokal adalah macos dan jenkins adalah ubuntu sejauh yang saya tahu.

Di MacOS Sierra, node 8.4 dan 7.11, mongodb 3.4.7, dan luwak 4.11.7 tes berikut lulus, tetapi pada server jenkins kami dengan versi yang sama persis di server ubuntu 16.04 gagal.

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

Inilah kesalahan persis yang saya dapatkan:

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

edit: Ini adalah versi jejak tumpukan yang lebih mudah dibaca

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

Komentar yang paling membantu

Nah itu salah satu masalahnya, mongodb 3.5 adalah rilis dev yang tidak stabil dan tidak boleh digunakan. $pushAll telah ditinggalkan untuk waktu yang lama jadi mungkin mereka menyingkirkannya dalam 3.5. @mbroadst dapatkah Anda mengklarifikasi?

Kami menambahkan opsi usePushEach untuk mengatasi ini beberapa waktu lalu: https://github.com/Automattic/mongoose/issues/4455 , yang seharusnya menjadi solusi untuk masalah ini:

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

Semua 27 komentar

dapatkah Anda melakukan mongoose.set('debug', true) dan menempelkan output mongo?

edit: keluaran lebih jelas

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}

Untuk apa nilainya, saya memeriksa keluaran debug di lingkungan pengembangan dan produksi lokal kami dan keduanya berhasil menggunakan pengubah $pushAll. Mongo diinstal dari paket resmi dalam semua kasus. Mesin pengembangan adalah windows dan MacOS, mesin produksi adalah amazon linux.

Bisakah Anda terhubung ke instance jenkins mongodb Anda menggunakan shell mongo dan memeriksa ulang versinya menggunakan 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

Anda juga dapat mencetak versi server menggunakan perintah serverStatus() menggunakan luwak:

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

Silakan periksa versi Anda terlebih dahulu, paket resmi cenderung cepat ketinggalan zaman.

ya, memiliki kesalahan yang sama. mencoba berpindah dari 3,2 ke 3,5 (tidak ada migrasi data). Saya memiliki bidang 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}
        } ]
    },

Saya tahu, id bukan nama bidang terbaik, tapi hei, ini berhasil di 3.2. Dalam 3.5 gagal setelah mencoba .save() dokumen setelah Item didorong ke dalam array. Saya mendorong item melalui .push() dan kemudian menandai bidang .markModified('liked.item'); . harus sederhana.

MongoDB 3.5?

Ya

 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

Nah itu salah satu masalahnya, mongodb 3.5 adalah rilis dev yang tidak stabil dan tidak boleh digunakan. $pushAll telah ditinggalkan untuk waktu yang lama jadi mungkin mereka menyingkirkannya dalam 3.5. @mbroadst dapatkah Anda mengklarifikasi?

Kami menambahkan opsi usePushEach untuk mengatasi ini beberapa waktu lalu: https://github.com/Automattic/mongoose/issues/4455 , yang seharusnya menjadi solusi untuk masalah ini:

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

@vkarpov15 ya sudah dihapus untuk featureCompatibilityVersion=3.6

sentuh. Dalam hal ini kami akan memastikan untuk mengeluarkan #5670.

saya mengalami masalah yang sama persis dengan saya menggunakan mongodb v3.6 di ubuntu saya. jika pushAll dihapus dari db daripada bagaimana saya harus menyimpan instance .. tolong berikan saya alternatif apa pun

@rankitbishnoi Anda dapat menyiasatinya untuk sementara dengan menambahkan opsi usePushEach pada setiap definisi skema dalam opsi.

@vkarpov15 Terima kasih atas perpustakaan yang fantastis, Pak.

Saya juga mengalami masalah ini dengan Mongoose 4.13.7 dan MongoDB 3.6.0.

PEMBARUAN: Menambahkan usePushEach: true ke opsi skema untuk model menyelesaikan ini.

@dyladan @chaddjohnson benar-benar berfungsi.
Terima kasih banyak!

tolong, bagaimana saya bisa melakukan ini? bagaimana saya bisa menambahkan ini ke opsi skema? Terima kasih!

@raphaelbp12 Berikut adalah dokumen tentang penggunaan opsi skema: http://mongoosejs.com/docs/guide.html

Memperbarui skema tidak mengubah perilaku ini. Ini tidak berfungsi untuk data lama dalam database untuk 3.6.

Sunting: Mengembalikan kembali ke versi 3.4 memecahkan masalah.

Saya mengalami masalah serupa saat menjalankan kode di mesin saya. Saya pikir itu karena Mongoose 5 dan MongoDB 3.6. Coba kembalikan:

  • Luwak ke versi 4.13.8 ( npm install [email protected] --save ), dan
  • MongoDB ke 3.4 (Anda dapat memeriksa versi dengan mengetik db.version() ).

Itu berhasil untuk saya! :)

Mongoose 5 seharusnya tidak terpengaruh oleh masalah ini, ia tidak menggunakan $pushAll mana pun. Jika Anda mendapatkan kesalahan ini dengan luwak 5, buka masalah dengan contoh kode :+1:

PS C:\Users\paula\projetos\apiNode\src> node index.js
{ MongoError: Pengubah tidak dikenal: $pushAll
di Function.MongoError.create (C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\error.js:31:11)
di toError (C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\utils.js:139:22)
di C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\collection.js:1059:67
di C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\connection\pool.js:469:18
di _combinedTickCallback (internal/process/next_tick.js:131:7)
di process._tickCallback (internal/process/next_tick.js:180:9)
nama: 'MongoError',
pesan: 'Pengubah tidak dikenal: $pushAll',
pengemudi: benar,
indeks: 0,
kode: 9

Halo semuanya, tolong beri tahu saya cara memperbaiki kesalahan Pengubah tidak dikenal: $ pushAll

обовал от ак е аботает
const luwak = membutuhkan ('luwak')
const ема = luwak.Skema

const UserSchema = Skema baru ({
nomor telegram: {
jenis: Nomor,
diperlukan: benar,
gunakanPushEach: benar
},

film: {
jenis: [Tali],
bawaan: []
}
})

luwak.model ('pengguna', Skema Pengguna)

@rivers-lis Anda harus menambahkan usePushEach ke opsi skema, bukan ke skema, seperti:

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

ак о от ак
const luwak = membutuhkan('luwak')
const Skema = luwak.Skema

const UserSchema = Skema baru({
nomor telegram: {
jenis: Nomor,
diperlukan: benar
},

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

})

Skema baru({}, {usePushEach: true})

luwak.model('pengguna', Skema Pengguna)

new Schema({ ... }, { usePushEach: true });
Ini memecahkan kesalahan untuk saya juga pada versi 4.4.12 dan 5.0.7

ак о от ак
const luwak = membutuhkan('luwak')
const Skema = luwak.Skema

const UserSchema = Skema baru({
nomor telegram: {
jenis: Nomor,
diperlukan: benar
},

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

})

Skema baru({}, {usePushEach: true})

luwak.model('pengguna', Skema Pengguna)

maaf tidak bisa membaca bahasa Rusia

@DanGDroid diterjemahkan secara kasar "Как о от ак" -> "Sesuatu seperti ini"

Apakah halaman ini membantu?
0 / 5 - 0 peringkat