web-dev-qa-db-fra.com

Comment utilisez-vous Mongoose sans définir de schéma?

Dans les versions précédentes de Mongoose (pour node.js), il était possible de l'utiliser sans définir de schéma.

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

Mais dans la version actuelle, la fonction "noSchema" a été supprimée. Mes schémas sont susceptibles de changer souvent et ne correspondent vraiment pas à un schéma défini. Existe-t-il une nouvelle façon d'utiliser des modèles sans schéma en mangouste?

103

Je pense que c’est ce que vous cherchez Mongoose Strict

option: strict

L'option strict (activée par défaut) garantit que les valeurs ajoutées à notre instance de modèle et non spécifiées dans notre schéma ne sont pas enregistrées dans la base de données.

Remarque: ne définissez pas sur false, sauf si vous avez une bonne raison.

    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!!
154
Jonathan P. Diaz

En réalité, le mode "Mixte" (Schema.Types.Mixed) Semble faire exactement cela en Mongoose ...

il accepte un objet JS de forme libre sans schéma , - peut y jeter. Il semble que vous deviez ensuite déclencher manuellement des sauvegardes sur cet objet, mais cela semble être un compromis équitable.

Mixte

Un SchemaType "tout va bien", sa flexibilité vient du fait qu'il est plus difficile à maintenir. Mixed est disponible via Schema.Types.Mixed Ou en passant un littéral d'objet vide. Les éléments suivants sont équivalents:

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

Comme il s'agit d'un type sans schéma, vous pouvez modifier la valeur comme vous le souhaitez, mais Mongoose perd la possibilité de détecter et d'enregistrer automatiquement ces modifications. Pour "indiquer" à Mongoose que la valeur d'un type mixte a changé, appelez la méthode .markModified(path) du document transmettant le chemin d'accès au type mixte que vous venez de modifier.

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

Hey Chris, regarde Mongous . J'avais le même problème avec la mangouste, car mes schémas changent extrêmement fréquemment en cours de développement. Mongous m'a permis d'avoir la simplicité de Mongoose, tout en pouvant définir et changer mes "schémas" de manière lâche. J'ai choisi de construire simplement des objets JavaScript standard et de les stocker dans la base de données, comme

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

Bien plus simple que Mongoose, bien que je pense que vous manquez des éléments de middleware tels que "pre". Je n'avais cependant pas besoin de ça. J'espère que cela t'aides!!!

14
Hacknightly