Şema tanımlamadan Mongoose'u nasıl kullanıyorsunuz?


118

Mongoose'un önceki sürümlerinde (node.js için) bir şema tanımlamadan onu kullanma seçeneği vardı

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

Ancak mevcut sürümde "noSchema" işlevi kaldırılmıştır. Şemalarım muhtemelen sık sık değişecek ve tanımlanmış bir şemaya gerçekten uymuyor, bu nedenle firavun faresinde şemasız modelleri kullanmanın yeni bir yolu var mı?


3
sadece Mongodb ovasını kullanın, bu varsayılan olarak daha az şema
Simon Dragsbæk

CreateConnection () örneğinin toplama yöntemi ne olacak?
Arnav Singh

Yanıtlar:


175

Sanırım bu, Mongoose Strict için arıyorsun

seçenek: katı

Katı seçeneği (varsayılan olarak etkindir), şemamızda belirtilmeyen model örneğimize eklenen değerlerin db'ye kaydedilmemesini sağlar.

Not: İyi bir nedeniniz yoksa yanlış olarak ayarlamayın.

    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
Günümü kurtardın. Ayrıca bunun #markMotified ('<columnName>') ile kullanılmaması gerektiğini öğrendim
allenhwkim

6
Not: Yapmak zorundasınız thing.set(key, value)çünkü thing.key=valuebu yöntemle çalışmıyor, yani veritabanında değişmeden kalmıyor.
gecikme refleksi

4
Bu yöntemi kullanırsanız, dokümanları alırken sorunlarla karşılaşırsınız. Bir bul ve sonra yaptıktan sonra doc.someProp doc.someProp, aslında nesnenin üzerinde olmasına rağmen (bir console.log bunu doğrular) tanımsız olacaktır, bunun nedeni firavun faresinin kendi alıcılarını tanımlamasıdır; şema üzerindeki destek
Melbourne2991

1
@ a20: Ne söylediğinizi anlıyorum MySQL:) Ve bence Jonathan'ın önerisi / Mongoose API Belgelerine göre Not: İyi bir nedeniniz yoksa yanlış olarak ayarlamayın . (Hakkında sadece geçerli bağlamda ile kesinlikle iyi mi NO-SQL)
Amol M Kulkarni

2
@ Melbourne2991 bu bir dereceye kadar doğru, ancak bulduğum bir geçici çözüm var. Aldığınız belgede toJSON () yöntemini çağırabilirsiniz; bu, daha sonra doc.someProp gibi normal nokta notasyonunuzu kullanmanıza izin verir. Bu kadar eski bir cevaba cevap verdiğim için üzgünüm. Birinin aynı şeyle karşılaşması ihtimaline karşı bunu eklemek istedim. https://mongoosejs.com/docs/guide.html#toJSON
Chris

60

Aslında "Karışık" ( Schema.Types.Mixed) mod, Mongoose'da tam olarak bunu yapıyor gibi görünüyor ...

şema içermeyen , serbest biçimli bir JS nesnesini kabul eder - böylece ona ne atarsanız atın. Daha sonra bu nesnede tasarrufları manuel olarak tetiklemeniz gerekiyor gibi görünüyor, ancak bu adil bir değiş tokuş gibi görünüyor.

Karışık

"Her şey yolunda" SchemaType, esnekliği, sürdürmenin daha zor olduğu bir ödünleşime gelir. Karışık, Schema.Types.Mixedboş bir nesne değişmezi aracılığıyla veya geçerek kullanılabilir . Aşağıdakiler eşdeğerdir:

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

Şemasız bir tür olduğundan, değeri istediğiniz herhangi bir şeye değiştirebilirsiniz, ancak Mongoose bu değişiklikleri otomatik olarak algılama ve kaydetme yeteneğini kaybeder. Mongoose'a Karma türün değerinin değiştiğini "söylemek" için .markModified(path), yolu az önce değiştirmiş olduğunuz Karma türe geçiren belgenin yöntemini çağırın .

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

Mongo / Mongoose ile şemasız çalışmanın hala doğru yolu bu mu?
a20

5
Ancak bu yapı, tüm nesneyi anyalanın altına yerleştirir , dolayısıyla aslında bir şemaya sahiptir. OP'ye daha iyi cevap strict: false, bu cevabın söylediği
steampowered

16

Hey Chris, Mongous'a bir bak . Şu anda geliştirme aşamasında Şemalarım çok sık değiştiği için firavun faresi ile aynı sorunu yaşıyordum. Mongous, "şemalarımı" gevşek bir şekilde tanımlayıp değiştirebilmeme yardımcı olurken, Mongoose'un sadeliğine sahip olmamı sağladı. Basitçe standart JavaScript nesneleri oluşturmayı ve bunları veritabanında bu şekilde depolamayı seçtim

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

Mongoose'dan çok daha basit, ancak "pre" gibi bazı harika ara katman yazılımlarını kaçırdığına inanıyorum. Yine de bunlara ihtiyacım yoktu. Bu yardımcı olur umarım!!!


1
Eğer hataları nasıl işleneceğini biliyor musunuz mongous tesadüfen? Bu, belgelerde biraz eksik.
Erik Aigner

4
Bunu sorunun gerçek cevabı olarak görmüyorum, @kwhitley Mongoose ile ilgili uygun cevaba sahip.
janex

Katılıyorum. Yine de, Schema.types.mixed'in bu soruyu sorduğu OP zamanında mevcut olduğundan emin değilim
Hacknightly

Burada OP, sizinle aynı fikirde olmaya meyilliyim, ancak cevap, bunu zaten kabul ettiğimden bir yıl sonra geldi.
Christopher Tarquini

1

Ayrıntılar açıklaması: [ 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.