web-dev-qa-db-fra.com

interroger une collection sans passer de schéma en mangouste

Dois-je bien comprendre que si je veux interroger une collection, je dois faire ce qui suit:

    var mongoose = require("mongoose");

mongoose.connect();

var db = mongoose.connection;

db.on('open', function callback () {

    var kittySchema = mongoose.Schema({
        name: String
    })

    var Kitten = mongoose.model('Kitten', kittySchema)


    Kitten.find(function (err, kittens) {
        console.log(kittens);
    })

});

Dois-je spécifier le schéma à chaque fois, même s'il y a déjà une collection de chatons?

Pourquoi ne puis-je pas faire quelque chose comme db.Kittens.find()?

16
user2422960

De la page d'accueil de Mongoose:

Mongoose fournit une solution simple, basée sur un schéma, pour la modélisation de vos données d’application et inclut le transtypage de type intégré, validation, création de requêtes, crochets de logique métier et plus, hors du boîte.

Mongoose ne peut pas déduire d'un schéma un ensemble de documents potentiellement uniques. MongoDB n'applique pas le schéma sur les documents stockés dans une collection. 

Mongoose ajoute donc une couche sur le pilote natif de NodeJS ( ici ) que beaucoup trouvent plus productive. L'utilisation de MongoDB n'est cependant pas obligatoire lorsque vous utilisez Node.JS.

Mongoose a fondamentalement besoin de deux choses pour fonctionner:

  1. Schema == définit la structure du document ( reference ). Vous pouvez ajouter validation , de nouvelles méthodes, ajouter des propriétés virtuelles, utiliser types de données , établir références à d’autres collections (modèles).
  2. Modèle == c'est la classe qui est ensuite utilisée au moment de l'exécution pour exprimer des requêtes sur des collections ( reference ). Une définition de schéma est utilisée pour créer un modèle. 

Ainsi, comme vous l'avez vu dans l'exemple que vous avez collé, un chaton Schema est défini, puis une ModelKitten est créée. Ce qui est bien avec l’utilisation d’un schéma et d’un modèle, c’est que Mongoose applique ensuite les propriétés/champs disponibles. 

Vous définissez uniquement les Schemas et Models une fois dans une application. Ainsi, généralement au démarrage de l'application, vous devez exécuter du code pour les définir, puis utiliser les instances Model selon les besoins tout au long du cycle de vie de l'application.

Il y a beaucoup d'autres raisons pour lesquelles vous voudriez utiliser potentiellement Mongoose. 

Vous avez tout à fait raison, vous pouvez simplement utiliser quelque chose de plus direct, sans schéma en utilisant le pilote natif NodeJS. La syntaxe serait semblable à celle que vous avez montrée, mais un peu plus complexe:

MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(err) { return console.dir(err); }

  var collection = db.collection('kittens');

    collection.find().toArray(function(err, kittens) {
        // here ...
    });    
});

Plutôt que le simple:

Kitten.find(function(err, kittens) {

});

De plus, lorsque vous utilisez Mongoose, il peut être plus simple d'écrire et de lire des requêtes plus complexes:

Kitten.find().where('name', 'Harold').exec(/*callback*/);

Je suggérerais de lire davantage de documentation pour avoir une meilleure idée du cadre et savoir s'il correspond bien à vos besoins. La documentation est malheureusement un peu éparse, mais si vous parcourez les sous-titres de la rubrique Guide, vous aurez beaucoup de bonnes informations disponibles.

29
WiredPrairie

Vous ne pouvez pas utiliser Mongoose sans schémas. Si vous voulez utiliser MongoDB sans schéma, n'utilisez pas Mongoose, utilisez plutôt quelque chose comme mongodb .

12
matthewtole

essaye ça..

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ProductSchema = new Schema({}, { strict: false });
const Product = mongoose.model('Product', ProductSchema, 'products');

module.exports = { Product };
1
Ritwik