Come si usa Mongoose senza definire uno schema?


118

Nelle versioni precedenti di Mongoose (per node.js) c'era un'opzione per usarlo senza definire uno schema

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

Ma nella versione attuale la funzione "noSchema" è stata rimossa. È probabile che i miei schemi cambino spesso e in realtà non si adattano a uno schema definito, quindi esiste un nuovo modo di utilizzare modelli senza schema in mangusta?


3
usa semplicemente Mongodb plain, questo è lo schema meno per impostazione predefinita
Simon Dragsbæk

Risposte:


175

Penso che questo sia quello che stai cercando Mongoose Strict

opzione: rigorosa

L'opzione rigorosa, (abilitata per impostazione predefinita), garantisce che i valori aggiunti all'istanza del nostro modello che non sono stati specificati nel nostro schema non vengano salvati nel database.

Nota: non impostare false a meno che tu non abbia una buona ragione.

    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
Mi hai salvato la giornata. Ho anche scoperto che questo non deve essere usato con #markMotified ('<columnName>')
allenhwkim

6
PS: devi farlo thing.set(key, value)perché thing.key=valuenon funziona con questo metodo, cioè non persiste modificato nel database altrimenti.
laggingreflex

4
Se utilizzi questo metodo, ti imbatterai in problemi durante il recupero dei documenti. Dopo aver eseguito una ricerca e quindi doc.someProp doc.someProp sarà indefinito, anche se è effettivamente presente sull'oggetto (un console.log lo conferma), questo perché mongoose definisce i propri getter che sembrano funzionare solo se si definisce quel puntello sullo schema
Melbourne2991

1
@ a20: capisco quello che dici di MySQL:) E penso che il suggerimento di Jonathan / come da Mongoose API Docs Nota: non impostare false a meno che tu non abbia una buona ragione . Va assolutamente bene con il contesto attuale (circa solo NO-SQL)
Amol M Kulkarni

2
@ Melbourne2991 questo è vero in una certa misura, tuttavia c'è una soluzione alternativa che ho trovato. Puoi chiamare il metodo toJSON () sul documento che hai recuperato che ti permetterà di usare la tua normale notazione a punti come doc.someProp. Mi dispiace rispondere a una risposta così vecchia. Volevo solo aggiungere questo nel caso qualcuno si imbattesse nella stessa cosa. https://mongoosejs.com/docs/guide.html#toJSON
Chris

60

In realtà "misto" (Schema.Types.Mixed ) sembra fare esattamente questo in Mongoose ...

accetta un oggetto JS senza schema e in forma libera , quindi qualunque cosa tu possa lanciargli contro. Sembra che tu debba attivare manualmente i salvataggi su quell'oggetto in seguito, ma sembra un giusto compromesso.

Misto

Uno SchemaType "tutto va bene", la sua flessibilità ha un compromesso in quanto è più difficile da mantenere. Mixed è disponibile tramite Schema.Types.Mixedo passando un valore letterale oggetto vuoto. I seguenti sono equivalenti:

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

Poiché è un tipo senza schema, puoi modificare il valore in qualsiasi altra cosa che ti piace, ma Mongoose perde la capacità di rilevare e salvare automaticamente tali modifiche. Per "dire" a Mongoose che il valore di un tipo Mixed è cambiato, chiama il .markModified(path)metodo del documento passando il percorso al tipo Mixed che hai appena modificato.

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

È ancora questo il modo giusto per lavorare senza schema con Mongo / Mongoose?
a20

5
Ma questa struttura annida l'intero oggetto sotto il anycampo, quindi in effetti ha uno schema. La risposta migliore all'OP è usare strict: falsecome dice questa risposta.
vapore il

16

Ehi Chris, dai un'occhiata a Mongous . Stavo avendo lo stesso problema con la mangusta, poiché i miei schemi cambiano molto spesso in questo momento in fase di sviluppo. Mongous mi ha permesso di avere la semplicità di Mongoose, pur essendo in grado di definire e modificare liberamente i miei "schemi". Ho scelto di creare semplicemente oggetti JavaScript standard e di archiviarli nel database in questo modo

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

Molto più semplice di Mongoose, anche se credo che ti perdi alcune cose interessanti del middleware come "pre". Non avevo bisogno di niente di tutto ciò però. Spero che questo ti aiuti!!!


1
Sai come gestire gli errori in mongous per caso? Questo è un po 'assente nei documenti.
Erik Aigner

4
Tuttavia, non la vedo come la vera risposta alla domanda, @kwhitley ha la risposta appropriata riguardo a Mongoose.
janex

Dovrei essere d'accordo. Non sono sicuro, tuttavia, che Schema.types.mixed fosse disponibile al momento in cui OP ha posto questa domanda
Hacknightly

OP qui, sono propenso a essere d'accordo con te, tuttavia, la risposta è arrivata un anno dopo che avevo già accettato questo.
Christopher Tarquini

1

Ecco la descrizione dei dettagli: [ 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.