Bagaimana Anda menggunakan Mongoose tanpa mendefinisikan skema?


118

Di versi Mongoose sebelumnya (untuk node.js), ada opsi untuk menggunakannya tanpa menentukan skema

var collection = mongoose.noSchema(db, "User");

Namun di versi sekarang, fungsi "noSchema" telah dihapus. Skema saya cenderung sering berubah dan benar-benar tidak cocok dengan skema yang ditentukan, jadi apakah ada cara baru untuk menggunakan model tanpa skema di luwak?


3
cukup gunakan Mongodb biasa, itu skema kurang secara default
Simon Dragsbæk

Jawaban:


175

Saya rasa inilah yang Anda cari tentang Mongoose Strict

opsi: ketat

Opsi ketat, (diaktifkan secara default), memastikan bahwa nilai yang ditambahkan ke contoh model kami yang tidak ditentukan dalam skema kami tidak disimpan ke db.

Catatan: Jangan setel ke false kecuali Anda punya alasan kuat.

    var thingSchema = new Schema({..}, { strict: false });
    var Thing = mongoose.model('Thing', thingSchema);
    var thing = new Thing({ iAmNotInTheSchema: true });
    thing.save() // iAmNotInTheSchema is now saved to the db!!

2
Anda menyelamatkan hari saya. Saya juga menemukan bahwa ini tidak boleh digunakan dengan #markMotified ('<columnName>')
allenhwkim

6
PS: Anda harus melakukan thing.set(key, value)karena thing.key=valuetidak bekerja dengan metode ini, yaitu tidak terus berubah ke dalam database sebaliknya.
laggingreflex

4
Jika Anda menggunakan metode ini, Anda akan mengalami masalah saat mengambil dokumen. Setelah melakukan pencarian dan kemudian doc.someProp doc.someProp tidak akan ditentukan, meskipun sebenarnya ada di objek (konsol.log mengonfirmasi ini), ini karena luwak mendefinisikan getternya sendiri yang tampaknya hanya berfungsi jika Anda mendefinisikan prop itu pada skema
Melbourne2991

1
@ a20: Saya mengerti apa yang Anda katakan tentang MySQL:) Dan menurut saya saran Jonathan / sesuai Dokumen Mongoose API Catatan: Jangan disetel ke false kecuali Anda memiliki alasan yang kuat . Baik-baik saja dengan konteks saat ini (hanya tentang NO-SQL)
Amol M Kulkarni

2
@ Melbourne2991 ini benar sampai batas tertentu, namun ada solusi yang saya temukan. Anda dapat memanggil metode toJSON () pada dokumen yang Anda ambil yang kemudian akan memungkinkan Anda untuk menggunakan notasi titik biasa seperti doc.someProp. Maaf membalas jawaban lama seperti itu. Hanya ingin menambahkan ini jika seseorang menemukan hal yang sama. https://mongoosejs.com/docs/guide.html#toJSON
Chris

60

Sebenarnya Schema.Types.Mixedmode "Mixed" ( ) tampaknya melakukan hal itu di Mongoose ...

ia menerima sebuah skema-kurang , bentuk yang unik JS objek - sehingga apa pun yang Anda dapat melemparkan di itu. Tampaknya Anda harus memicu penyelamatan pada objek itu secara manual setelahnya, tetapi sepertinya pertukaran yang adil.

Campuran

SchemaType "apa saja bisa terjadi", fleksibilitasnya datang dari trade-off karena lebih sulit untuk dipertahankan. Campuran tersedia baik melalui Schema.Types.Mixedatau dengan melewatkan literal objek kosong. Berikut ini adalah padanannya:

var Any = new Schema({ any: {} });
var Any = new Schema({ any: Schema.Types.Mixed });

Karena ini adalah jenis tanpa skema, Anda dapat mengubah nilainya menjadi apa pun yang Anda suka, tetapi Mongoose kehilangan kemampuan untuk mendeteksi dan menyimpan perubahan tersebut secara otomatis. Untuk "memberitahu" Mongoose bahwa nilai dari tipe Campuran telah berubah, panggil .markModified(path)metode dokumen yang meneruskan jalur ke tipe Campuran yang baru saja Anda ubah.

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

Apakah ini masih cara yang benar untuk bekerja tanpa skema dengan Mongo / Mongoose?
a20

5
Tapi struktur ini menyarangkan seluruh objek di bawah kolom any, jadi sebenarnya struktur ini memiliki skema. Jawaban yang lebih baik untuk OP adalah dengan menggunakan strict: falsesebagai jawaban ini mengatakan.
bertenaga uap pada

16

Hei Chris, lihat Mongous . Saya mengalami masalah yang sama dengan luwak, karena Skema saya sangat sering berubah saat ini dalam pengembangan. Mongous memungkinkan saya untuk memiliki kesederhanaan Mongoose, sambil dapat secara longgar mendefinisikan dan mengubah 'skema' saya. Saya memilih untuk hanya membuat objek JavaScript standar dan menyimpannya dalam database seperti itu

function User(user){
  this.name = user.name
, this.age = user.age
}

app.post('save/user', function(req,res,next){
  var u = new User(req.body)
  db('mydb.users').save(u)
  res.send(200)
  // that's it! You've saved a user
});

Jauh lebih sederhana daripada Mongoose, meskipun saya yakin Anda melewatkan beberapa middleware keren seperti "pre". Saya tidak membutuhkan semua itu. Semoga ini membantu!!!


1
Apakah Anda tahu bagaimana menangani kesalahan yang banyak terjadi secara kebetulan? Ini agak hilang di dokumen.
Erik Aigner

4
Saya tidak melihat ini sebagai jawaban sebenarnya untuk pertanyaan itu, @kwhitley memiliki jawaban yang sesuai tentang Mongoose.
Januari

Saya harus setuju. Saya tidak yakin, bahwa Schema.types.mixed tersedia pada saat OP mengajukan pertanyaan ini
Hacknightly

OP di sini, saya cenderung setuju dengan Anda, namun, jawabannya datang setahun setelah saya menerima yang ini.
Christopher Tarquini

1

Berikut deskripsi detailnya: [ https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html][1]

    const express = require('express')()
    const mongoose = require('mongoose')
    const bodyParser = require('body-parser')
    const Schema = mongoose.Schema

    express.post('/', async (req, res) => {
        // strict false will allow you to save document which is coming from the req.body
        const testCollectionSchema = new Schema({}, { strict: false })
        const TestCollection = mongoose.model('test_collection', testCollectionSchema)
        let body = req.body
        const testCollectionData = new TestCollection(body)
        await testCollectionData.save()
        return res.send({
            "msg": "Data Saved Successfully"
        })
    })


  [1]: https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.