Creating a collection schema in a mongolab mongodb database from node.js
Asked Answered
P

2

11

I'm new to node.js and mongodb.

I'm trying to create a schema for a User collection in a mongolab mongodb database from a node.js app with the code below. The code does not seem to be failing (at least, I get no error messages), but I don't see any indication that it is succeeding either. That is, when I go to mongolab and look at my database, I don't see that any schema was created - https://dzwonsemrish7.cloudfront.net/items/01263Y1c312s233V0R17/mongodb-schema.png?v=7fdc20e3.

Can someone explain what I might be doing wrong, or how I can verify that my code succeeded and a schema was, in fact, created for my collection?

// file: app.js

var express = require('express'),
    http = require('http'),
    mongoose = require('mongoose');

var app = express(),
    port = 3000;

// Connect to database in the cloud (mongolab)
mongoose.connect('mongodb://username:[email protected]:41344/stockmarket');

// Create a schema for User collection
mongoose.connection.on('open', function () {
    console.log(">>> Connected!");

    var UserSchema = new mongoose.Schema({
        username: {type: String, unique: true},
        password: String
    });

    var UserModel = mongoose.model('User', UserSchema);
});

app.get('/', function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!\n');
});

http.createServer(app).listen(port, function(){
  console.log("Express server listening on port " + port + " ...");
});
Piled answered 10/11, 2012 at 14:8 Comment(0)
C
9

You must insert a document first. Schemas are not explicitly defined in mongodb. Once you insert a document, the collection will automatically be created and you will see it in the mongolab console.

Example from http://mongoosejs.com/

var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'test');

var schema = mongoose.Schema({ name: 'string' });
var Cat = db.model('Cat', schema);

var kitty = new Cat({ name: 'Zildjian' });
kitty.save(function (err) {
  if (err) // ...
  console.log('meow');
});

after the save call above the collection will be created

Constitute answered 10/11, 2012 at 15:54 Comment(5)
How do I do this? What should I add/change in the code above?Piled
You have to review the mongoose API documentation. There are also examples around stack overflow eg. https://mcmap.net/q/348591/-how-to-insert-a-doc-into-mongodb-using-mongoose-and-get-the-generated-id/579461Constitute
I did read the mongoose doc, and it said: "A model is a class with which we construct documents." which implies that the model comes before the document, but you need a schema to create a model. So the order seems to be: schema -> model -> document. Sounds like you're saying the order is document -> schema -> model. I'm confused.Piled
The order you mentioned is correct, but you have not created or inserted a document. Until you insert a document, the mongodb server will not create a collection in this case. Nothing is actually done on the server side when you define your mongoose schema or model. Updating answer with an example.Constitute
Aha! Thanks, Brian. Sorry for the confusion ... I'm reading this book (in the wee hours of the morning when I really should be sleeping instead), and [I thought] it said that after I create a Schema, I should see something in mongolab that shows the schema was created. This did not happen, so I thought my code was failing silently. But now I get it. Thanks again.Piled
G
0

Data in MongoDB has a flexible schema. Documents in the same collection do not need to have the same set of fields or structure, and common fields in a collection’s documents may hold different types of data.

Graniteware answered 30/8, 2015 at 12:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.