MongoDB

MongoDB Driver

  • mongo ์ฝ˜์†” ํด๋ผ์ด์–ธํŠธ ๋ช…๋ น๊ณผ ๋™์ผํ•˜๊ฒŒ ์กฐ์ž‘
  • npm install mongodb

MongoClient

  • var MongoClient = require('mongodb').MongoClient;
  • MongoClient.connect(url,option,callback)
  • callback : function(error,db);
var var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/DATABASE';
var db;
 
MongoClient.connect(url, function (err, database) {
   if (err) {
      console.error('MongoDB ์—ฐ๊ฒฐ ์‹คํŒจ', err);
      return;
   }
 
   db = database;
});

Collection ๊ฐ€์ ธ์˜ค๊ธฐ

var var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/DATABASE';
var db;
 
MongoClient.connect(url, function (err, database) {
   if (err) {
      console.error('MongoDB ์—ฐ๊ฒฐ ์‹คํŒจ', err);
      return;
   }
 
   db = database;
});
 
var movies = db.Collection('movies');
movies.insert();

Document Insert

  • insert(docs, options, callback)
  • insertMany(docs, options, callback)
  • insertOne(doc, options, callback)
  • Promise๊ธฐ๋ฐ˜, ๋ฐ˜ํ™˜๊ฐ’์ด Promise
  // Promise Based  
  movies.insert({ title:'์Šคํƒ€์›Œ์ฆˆ7', director:'JJ ์—์ด๋ธŒ๋Ÿผ์Šค', year:2015}).then(function(results) {
     // console.log('== Resolved\n', results);
     console.log('Promise Based Insert Result : ', results);
  }, function(err) {
     console.log('== Rejected\n', err);      
  });

Document find

  • find : Cursor
  • findOne(query, options, callback)
// ์ฝœ๋ ‰์…˜
var movies = db.collection('movies');
 
// ์ „์ฒด ๋ชฉ๋ก
movies.find().toArray(function (err, docs) {
   console.log('== Find ALL, toArray');
   console.log(docs);
});
 
// projection
var projection = { _id: 0, title: 1 };
movies.find({}, projection).toArray(function (err, docs) {
   console.log('== Find ALL with Projection');
   console.log(docs);
});
 
// Query
movies.find({ title: '์ธํ„ฐ์Šคํ…”๋ผ' }).toArray(function (err, docs) {
   console.log('== Find ์ธํ„ฐ์Šคํ…”๋ผ');
   console.log(docs);
});
 
// Query : db.movies.find({year:{$gt:2000} })
movies.find({ year: { $gt: 2000 } }).toArray(function (err, docs) {
   console.log('== 2000๋…„ ์ดํ›„์˜ ์˜ํ™”');
   console.log(docs);
});
 
// Query : db.movies.find({ $or:[ { year: {$gt:2000} },{ director:"ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€" } ] } )
movies.find({ $or: [{ year: { $gt: 2000 } }, { director: "ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€" }] }).toArray(function (err, docs) {
   console.log('== OR Query');
   console.log(docs);
});
 
// limit(5)
movies.find({}).limit(2).toArray(function (err, docs) {
   console.log('== limit');
   console.log(docs);
});
 
// ObjecdtID
movies.findOne({}).then(function(result) {
   var objectIDStr = result._id.toString();
 
   movies.findOne({_id:objectIDStr}).then(function(result) {
      console.log('Find By ID Str : \n', result);
   }, function(err) {
      console.log('Find By ID Str Error : ', err);
   });
 
   movies.findOne({_id:new ObjectID(objectIDStr)}).then(function(result) {
      console.log('Find By ObjectID : \n', result);
   }, function(err) {
      console.log('Find By ObjectID Error : ', err);
   });
});

Document Update

var movies = db.collection('movies');
 
   // Update One
   movies.updateOne({ title: '์Šคํƒ€์›Œ์ฆˆ' }, { $set: { title: 'StarWars' } }, function (err, result) {
      if (err) {
         console.error('UpdateOne Error ', err);
         return;
      }
      console.log('UpdateOne ์„ฑ๊ณต ', result);
   });
 
   // Update Multi Option - Promise Based
   movies.update(
      { director: 'ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€' },
      { $set: { director: 'Christopher Nolan' } }, { multi: true }).then(
      function resolved(results) {
         console.log('Update Success. Promise Based Result : ', results);
       },
      function rejected(err) {
         console.error('Update Error. Rejected : ', err);
    });

Document Delete

var movies = db.collection('movies');
 
   // Delete One
   movies.deleteOne({title:'์Šคํƒ€์›Œ์ฆˆ'}, function(err, result) {
      if ( err ) {
         console.error('DeleteOne Error ', err);
         return;
      }      
      console.log('DeleteOne ์„ฑ๊ณต ', result);
   });
 
   // Delete Many Documents
   movies.deleteMany({director:'ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€'}).then(function resolved(result) {
      console.log('Delete Many Success : ', result);
   }, function rejected(err) {
      console.log('Delete Many Fail : ', err);
   });   

Mongoose

  • ODM : Object Document Mapper
  • npm install mongoose
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ
  • ์Šคํ‚ค๋งˆ ์ •์˜
  • ์Šคํ‚ค๋งˆ์—์„œ ๋ชจ๋ธ
  • ๋ชจ๋ธ์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

var mongoose = require('mongoose');
var url = 'mongodb://localhost:27017/Nelp';
mongoose.connect(url);
var db = mongoose.connection;
db.on('error', function(err) {
   console.log('Error : ', err);
});
db.on('open', function() {
   console.log('Open Event');
});

์Šคํ‚ค๋งˆ ์ •์˜

var MovieScheme = mongoose.Schema({
  title : String,
  director : String,
  year : Number,
  synopsis : String
});
var Movie = mongoose.model('Movie', MovieScheme);

Error ์ฒ˜๋ฆฌ

  • mongoose v4 ์ด์ƒ์˜ ๋ฒ„์ „๋ถ€ํ„ฐ mongoose์˜ save()์™€ ์ฟผ๋ฆฌ๊ฐ™์€ ๋น„๋™๊ธฐ ๋™์ž‘์—์„œ๋Š” Promises/A+ conformant pomises๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

  • mongoose.Promise = global.Promise; ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

__v ์ œ๊ฑฐํ•˜๊ธฐ

  • versionKey๊ฐ€ Default๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

var UserSchema = new mongoose.Schema({
    nickname: String,
    reg_time: {type: Date, default: Date.now}
}, {
    versionKey: false // You should be aware of the outcome after set to false
});

Document Insert

  • Model.save(function(err,product)); : Callback
  • Model.save().then(resolved,rejected); : Promise
// Promise Based
  // notDefined๋Š” ์Šคํ‚ค๋งˆ์— ์ •์˜๋œ ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋‹ค. - ์ €์žฅ ์•ˆ๋จ
  var starwars = new Movie({title:'์Šคํƒ€์›Œ์ฆˆ7', director:'JJ ์—์ด๋ธŒ๋Ÿผ์Šค', year:2015, notDefined:true});
  starwars.save().then(function(product) {
     console.log('Save Resolved : ', product);
  }, function rejected(err) {
     console.log('Save Rejected : ', err);
  });   
 
  Movie.create({title:'์•„๋ฐ”ํƒ€', director:'์ œ์ž„์Šค ์นด๋ฉ”๋ก ', year:2010}).then(resolved, rejected);
  Movie.create({ title: '๋‹คํฌ ๋‚˜์ดํŠธ', director: 'ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€', year: 2008 }).then(resolved, rejected);

Document Find

// ์ฝœ๋ฐฑ์„ ์ด์šฉํ•œ ๊ฒ€์ƒ‰
  Movie.find({year:{$gt:2010}}, function(err, docs) {
     console.log(docs);
  });   
 
  // ์ฟผ๋ฆฌ ๊ฐ์ฒด - exec๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  Movie.findOne({title:'์ธํ„ฐ์Šคํ…”๋ผ'}).exec(function(err, docs) {
     console.log(docs);
  });   
 
  Movie.where('year').gt(2010).exec(function(err, docs) {
     console.log('year > 20!0 : ', docs);
  });

Document Update

// ๋„ํ๋จผํŠธ ์ˆ˜์ • ํ›„ ์ €์žฅ
   Movie.findOne({title:'์•„๋ฐ”ํƒ€'}).exec(function(err, doc) {
      if ( doc ) {
         doc.title = 'Avata';
         doc.save(function(err, product) {
            console.log('Modify and Save : ', product);
         });         
      }
   });
 
   Movie.update({director:'ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€'}, {$set:{director:'Christopher Nolan'}} ).then(resolved, rejected);

Document Delete

// ๋„ํ๋จผํŠธ ์‚ญ์ œ
Movie.findOne({title:'์•„๋ฐ”ํƒ€'}).exec(function(err, doc) {
   if ( doc ) {
      doc.title = 'Avata';
      doc.remove(function(err, product) {
         console.log('Find and Remove : ', err, product);
      });         
   }
});
 
Movie.remove({director:'ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€'}).then(resolved, rejected);

Reference