במאמר הקודם דיברנו על MongoDB ו-Node.js. במאמר הזה אני אדבר על Node.js ו-MongoDB. בשנים האחרונות MongoDB הולכת בעיקר יד ביד עם Node.js. זה לא פלא גדול כל כך, שתיהן עובדות עם JavaScript ומאוד קל לדלג בין MongoDB ל-Node.js. גם ל-Node.js יש שפע של מודולים שמטפלים ועובדים עם MongoDB. הפופולריות הגדולה של MEAN stack גם גרמה לזה בעקיפין.
יש מספר מודולים של Node.js שמטפלים בחיבור ל-MongoDB. שניים מהם הם מאוד פופולריים. הראשון הוא node-mongodb-native והוא הדרייבר הטבעי של Node.js ל-MongoDB. השני הוא Mongoose שיושב בעצם על גבי MongoDB Native ומבצע גם סוג של ORM. במאמר הזה אני אסביר על MongoDB Native. כל הדוגמאות מבוססות על הדוגמאות מהגיטהאב של MongoDB native.
לפני תחילת העבודה אנו צריכים ששרת ה-MongoDB ירוץ. מה זה שרת? זה בעצם השירות שמאפשר לכל תוכנה להתחבר ל-MongoDB. בדיוק כפי שאנו מרימים (למשל) שרת כדי לקבל פקודות באמצעות socket מתוכנות אחרות.
mongod --dbpath=/data --port 27017
הפרוסס הזה צריך לרוץ אם אנו רוצים לעבוד מול MongoDB. שימו לב שצריכה להיות לכם הרשאה ל data\
הערה חשובה: אם אתם עובדים עם MongoDB באמצעות PHP באותה מכונה והתקנתם את MongoDB Driver באמצעות PEAR כמו במאמר הקודם, לא תצטרכו לבצע את הצעד הזה כיוון שהשרת כבר יעבוד אצלכם.
איך בודקים שהכל תקין? נכנסים אל: localhost:27017 עם הדפדפן ורואים ש:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
הצעד הבא הוא להתקין את המודול דרך npm. ככה עושים את זה באופן לוקלי:
npm install mongodb
ועכשיו אפשר להתחיל לעבוד. האמת היא שהעבודה היא יחסית פשוטה. נניח ואנו רוצים להתחבר למסד הנתונים test. את זה אנו מגדירים כבר בחיבור:
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
//Async function
});
בת'כלס אין כאן משהו שיפיל אתכם. אם אתם מתחברים לשרת מרוחק, מכניסים את הפרמטרים ב-connect. אם זה באותה מכונה שבה הקוד רץ, משתמשים ב-localhost. מדובר בפונקציה אסינכרונית שבתוכה ירוץ ה-CRUD. אם תנסו לעשות משהו לפני שמסד הנתונים יהיה מוכן… טוב, אתם יודעים איך זה ייגמר 🙂
אחרי שבחרנו את ה-DB, אנחנו צריכים לבחור מול איזה collection לעבוד. גם זה קל
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
});
כאן אני בוחר ב-collection users. קל ופשוט. מפה אני יכול להתחיל לבצע פעולות. ה-find מתחיל מה-collection, בדיוק כמו בקונסולה. אם עברתם על המדריך וקצת תרגלתם, אתם יודעים שאני צריך להשתמש ב-find. בואו נשתמש ב-find כדי למצוא את x:19 במשתמשים שלנו (תרגלנו את מסד הנתונים הזה במאמרים הקודמים ויש שם הוראות איך ליצור אותו).
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
collection.find({"x":19}).toArray(function(err, items) { //foreach
console.log(items);
});
});
במקרה הזה אנו מדפיסים את מה שאנו מקבלים לתוך מערך ומדפיסים את התוצאות. מאוד חשוב להקפיד שאם ה-x הוא string להקיף אותו במרכאות!
ואיך אני מכניס נתונים? עם מתודת insert, אנחנו מעבירים לה אובייקט JSON
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
var doc = {"x" : 999, "name" : "Ran" }; //valid JSON ibject
collection.insert(doc,function(err, result) {
if(err) throw Error;
console.log(result); //we are getting back the object inserted
});
collection.find({"x":999}).toArray(function(err, items) { //foreach
console.log(items);
});
});
ועדכון? בערך באותה דרך
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
collection.update({"x":999}, {$set:{"name":"moshe"}}, function(err, result) {
console.log(result); //return true in case of success
});
});
ועדכון של יותר מערך אחד? זה שצריך להעביר ,{multi: true} בשבילו?
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
collection.update({"x":999}, {$set:{"name":"moshe"}}, {multi: true}, function(err, result) {
console.log(result); //return true if success
});
});
באופן עקרוני, כך אנו מעבירים אוביקטים נוספים בכל מצב – גם ב-insert או ב-find.
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) { return console.dir(err); } //handling errors
var collection = db.collection('users'); //selecting the collection
collection.remove({"x":999}, function(err, result) {
console.log(result); //number of deleted items
});
});
באופן עקרוני אין כאן גליק גדול, בטח שלא קשור לפעולות הבסיסיות. ומי ששולט ב-MongoDB יסתדר מצוין עם הפעולות הבסיסיות. ואם צריך משהו מעבר? יש את הדוקומנטציה עם הסבר על כל הפעולות שאפשר לעשות בנוסף.
מי שהגיע לשלב הזה ועבר על כל המדריך בקפידה, ידע היטב לתפעל MongoDB באופן בסיסי – לבצע CRUD, לעבוד עם קבצים בינאריים, למדל את ה-collections, לבחור אינדקסים ולייבא ולייצא. שזה בכלל לא רע. המאמרים הבאים יוקדשו לעבודה מעט יותר מתקדמת.
במאמר הבא אנו נדבר על MongoDb: Aggregations.
תגובה אחת
Great One, Thanks again!