SlideShare a Scribd company logo
1 of 41
Download to read offline
NoSQL & JavaScript
  a Love Story!
    by Alexandre Morgaut




       TakeOff Conf - Lille 2013
Presentation
  W3C AC member
  Wakanda Community
  Web Architect
  JS Expert
  REST Lover
  NoSQL Fanboy
 @amorgaut
NoSQL facts
NoSQL Facts
Mostly Schemaless
Often with REST / JSON API
Many store JSON
Many embed a JavaScript engine
   Map / Reduce
   events
Many propose a JavaScript Shell
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
JavaScript facts
JavaScript Facts
Created in 1995
Running in Netscape Server in 1996, and then in IIS
Mostly Event-Driven
Recommended in the REST deļ¬nition in 2000
Integrated in CouchDB in 2007
HTML5 Datastores appeared in 2009
JavaScript Engines
                                                                                                                                                C+
                                         C                                                                                                        +
 SpiderMonkey                                                       webkit JavaScriptCore: JSC
            3 JIT Compilers:                                                  SquirrelFish Extreme: SFX aka Nitro
             TraceMonkey,                                                               (JIT Compiler inside)
             JƤgerMonkey,
               IonMonkey


                                  Jav                                                                               C+
                                     a                                                                                +
            Rhino                                                                                         V8
  Interpreted or Compiled execution                                                               JIT Compiler: CrankShaft


Nashorn?
                                                                                                  ?
                                             Trident: MSHTML
                                                  Chakra
                                             -> Classic JScript, Managed JScript, & JScript.NET
                               C+                                                                                                   ?
                                 +
             Tamarin                                                                                             Carakan
       JIT Compiler: NanoJIT
      -> ActionScript / ā€œECMAScript 4ā€
                                                                                                      Previously: Linear A, Linear B, Futhark
Server-Side JavaScript
SpiderMonkey            JavaScriptCore




   Rhino                      V8


           Trident / Chakra
JavaScript & Databases
JavaScript & Databases
Netscape Enterprise Server
Microsoft: JScript, JScript.NET, ActiveX
Mozilla Rhino
JSDB
APE Project
W3C Web SQL
Netscape Enterprise Server

SQLTable()                           pool = new DbPool("ORACLE", addr, user, pwd, "", 5, true);
                                     connection = pool.connection("A connection");

                                     cursor = connection.cursor("select name from customer");


DbPool                               if ( cursor && (connection.majorErrorCode() == 0) ) {
                                        // Get the first row
                                        cursor.next();
                                        // Display the values
                                        write("<B>Customer Name:</B> " + cursor.name + "<BR>");

start/home.html                      }
                                        //Close the cursor
                                        cursor.close();




Shared Connections

   Note: Netscape Enterprise Server merged with Javagator to become iPlanet
MS JScript on the server
                                            conn = Server.CreateObject("ADODB.Connection");


Active Server Page                          conn.Open(dsn, login, password);

                                            reccordset = conn.Execute(sqlQuery);
                                            result = [];


   runat=ā€serverā€                           while (!reccordset.EOF) {

                                                result.push({
                                                    field1: reccordset("field1"),
                                                    field2: reccordset("field2")

Windows Script Hosting                          });
                                                rsAuthor2.MoveNext;

                                            }



.NET
                                            conn.Close();
                                            conn = null;




          Note: JScript is running on Microsoft IIS since 1997
MS JScript in the Browser

                var connection = new ActiveXObject("ADODB.Connection");
                Ā Ā 
                connection.Open(dsn, login, password);
                var reccordset = new ActiveXObject("ADODB.Recordset");

ActiveXObject
                Ā 
                reccordset.Open(sqlQuery, connection);
                reccordset.MoveFirst;

                while(!reccordset.eof) {

   only IE      }
                   document.write(reccordset.fields(1));
                   reccordset.movenext;

                Ā 
                reccordset.close;
                connection.close;
Mozilla Rhino

                                   importPackage(java.sql);
                                   java.lang.Class.forName("org.sqlite.JDBC");


Java environment                   conn = DriverManager.getConnection("jdbc:sqlite:test.db");
                                   stat = conn.createStatement();
                                   resultSet = stat.executeQuery("select * from people;");

                                   while (resultSet.next()){

Access to JDBC                         print(
                                           resultSet.getString("name") +
                                           " - " +
                                           resultSet.getString("occupation")
                                       );

ex: RingoJS
                                   }

                                   resultSet.close();
                                   stat.close();
                                   conn.close();




                   https://developer.mozilla.org/en-US/docs/Rhino
JSDB

                                var db = new ODBC(dsn);
                                var result = db.query("select * from mytable");



SpiderMonkey
                                var searcher = new Index;
                                for (var i=1; i <= result.count; i++)
                                {
                                  searcher.add(result.get('NAME'));
                                }


Shell                           var i = searcher.find('Mr. Smith');
                                var r = result.getRow(i + 1);

                                writeln('Data for Mr. Smith');
                                writeln(r.toString());

JS Server                       db.close();




               http://www.jsdb.org/
APE Project
                                 var sql = new Ape.MySQL(ip + ":3306", user, password, db);

                                 Ape.registerCmd('foo', true, function(params, cmd) {

Real Time Web                           cmd.user.sendRaw(
                                            'bar', {
                                                hello: 'world',
                                                echo: params.ping

   Comet
                                            }
                                        );

                                        sql.query(
                                            'INSERT INTO table(log) VALUES("' +


   Web Sockets
                                            Ape.MySQL.escape(params.ping) +
                                            '")',
                                            function(res, errorNo) {
                                                Ape.log('Inserted ' + this.getInsertId());
                                            }


MySQL
                                        );
                                 });




                Note: APE means ā€œAjax Push Engineā€
                          http://www.ape-project.org/
W3C Web SQL

HTML5                   var db = openDatabase('mydb', '1.0', 'my first db', 2 * 1024 * 1024);



                      db.transaction(function (tx) {

    Safari              tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');
                        tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")');
                      });




    Chrome                     tx.executeSql('SELECT * FROM foo', [], function (tx, results) {
                                 for (var i = 0, len = results.rows.length; i < len; i++) {
                                   alert(results.rows.item(i).text);
                                 }
                               });

    Opera                              result = x.executeSqlSync('SELECT * FROM foo');
                                       for (var i = 0, len = results.rows.length; i < len; i++) {
                                         alert(results.rows.item(i).text);

Sync / Async                           }




 Note: standard paused because current implementations are only based on SQLite
                          http://html5doctor.com/introducing-web-sql-databases/
Data as a Service (DaaS)
Data as a Service
                    Amazon APIs
   OData
            APP

   GData          Twitter APIs
Touching the DB heart
Touching the DB Heart

Key-Value: Web Storage, Riak

Document: CouchDB, MongoDB, IndexedDB

Object: JavaScriptDB, WakandaDB

Multi-Model: OrientDB & ArangoDB
Key - Value
Web Storage

W3C / WHATWG                                      // set or get items by methods
                                                  localStorage.setItem("storedItem", "value");
                                                  var value = localStorage.getItem("storedItem");




    HTML5                                                  // set or get items using the store as a map
                                                           localStorage.storedItem = value;
                                                           var value = localStorage.storedItem;



local                                                      // accessible only for this session
                                                           var foo = sessionStorage.bar;
                                                           sessionStorage.bar = foo;



session                                 // sync interface when data change, even from other window
                                        window.addEventListener("storage", handle_storage, false);




events
Note: Firefox used to propose ā€œglobalStorageā€, Wakanda implements ā€œuser.storageā€
                               http://www.w3.org/TR/webstorage/
Riak
 Buckets
                                   {"inputs": "goog",
                                     "query": [
                                       {"map": {"language": "javascript",
                                         "source": "function(value, keyData, arg){...}"
                                       }},


 REST / JSON
                                       {"reduce": {"language": "javascript",
                                         "source": "function(values, arg){...}",
                                         "keep": true
                                       }}
                                     ]
                                   }

 Map / Reduce
                                // Map: compute the daily variance, key it by the month
                                function(value, keyData, arg){

 Erlang alternative:              var data = Riak.mapValuesJson(value)[0];
                                  var month = value.key.split('-').slice(0,2).join('-');
                                  var obj = {};
                                  obj[month] = data.High - data.Low;
                                  return [ obj ];


    SpiderMonkey
                                }



           // Reduce: find the maximum variance per month
           function(values, arg) {
             return [values.reduce(function(acc, item){
               for (var month in item) {
                  acc[month] = acc[month] ? Math.max(item[month], acc[month]) : item[month];
               }
               return acc;
             })];
           }
Document
IndexedDB
W3C / WHATWG
                                            var request = indexedDB.open("MyTestDatabase", 3);



                                                    request.onerror =    function(event) {
                                                       // Do something   with request.errorCode!

   HTML5                                            };
                                                    request.onsuccess
                                                       // Do something
                                                                         = function(event) {
                                                                         with request.result!
                                                    };


Sync / Async                                        request.onupgradeneeded = function(event) {
                                                       // Update object stores and indices ....
                                                    }


Indexes           var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

                  objectStore.createIndex("name", "name", { unique: false });


Transactions
                  objectStore.add({ ssn: "444-44-4444", name: "Bill", age: 35});




               var transaction = db.transaction(["customers"], IDBTransaction.READ_WRITE);

Cursors
                        http://www.w3.org/TR/IndexedDB/
CouchDB
                      function(doc) {
                        if (doc.Type == "customer") {
                          emit(doc.LastName, {FirstName: doc.FirstName, Addr: doc.Address});
                          emit(doc.FirstName, {LastName: doc.LastName, Addr: doc.Address});

Views                 }
                        }




JSON*
                                         {
                                              "total_rows":2,
                                              "offset":0,
                                              "rows":
                                              [


Map / Reduce
                                                {
                                                  "id":"64ACF01B05F53ACFEC48C062A5D01D89",
                                                  "key":"Katz",
                                                  "value":{"FirstName":"Damien", "Addr":"Charlotte NC"}
                                                },
                                                {

Erlang alternative:                               "id":"64ACF01B05F53ACFEC48C062A5D01D89",
                                                  "key":"Damien",
                                                  "value":{"LastName":"Katz", "Addr":"Charlotte NC"}
                                                },
                                              ]

   Spidermonkey                          }




         Note: CouchDB moved from XML to JSON & JS in 2007*
                             http://wiki.apache.org/couchdb/HTTP_view_API
                * http://jan.prima.de/~jan/plok/archives/89-CouchDb-updates.html
CouchBase

CouchDB alternative
   using V8
   adding memcache
   meant to be more scalable

                      http://www.couchbase.com/
MongoDB
                                          { text: "lmao! great article!",

Spidermonkey                              }
                                            author: 'kbanker',
                                            votes: 2




BSON                                              var map = function() {
                                                     emit(this.author, {votes: this.votes});
                                                  };


Map / Reduce                                          // Add up all the votes for each key.
                                                      var reduce = function(key, values) {
                                                         var sum = 0;

REST / JSON                                              values.forEach(function(doc) {
                                                           sum += doc.votes;
                                                         });
                                                         return {votes: sum};
                                                      };


REST / JS
               var op = db.comments.mapReduce(map, reduce, {out: "mr_results"});


Shell
               http://www.mongodb.org/display/DOCS/MapReduce
Object
Persevere JavaScriptDB
                                                            var d = new Data();
                                                            d.test = 12345;




Rhino
                                                                        {"id":"generated.js",
                                                                        "sources":[
                                                                          {
                                                                            "name":"Data",
                                                                            "extends":"Object",

REST / JSON                                                                 "schema":{
                                                                               "extends":{"$ref":"../Class/Object"},
                                                                               hello : function() {
                                                                                  console.log("hello hi");
                                                                               },

JSON Schema                                                                  }
                                                                               "prototype":{
                                                                               }

                                                                          }]


JSON Path
                                                                        }


                                                                curl localhost:8080/Data/1


JSON Query                                                      ({"id":"1","test":12345})


                                                            Data.hello(); // INFO: hi there


        http://www.sitepen.com/blog/2009/04/20/javascriptdb-perseveres-new-high-performance-storage-engine/
WakandaDB
 Webkit JavaScriptCore
 REST / JSON
 Data Classes
    auto-updatable
    accessors
                john = ds.Person.ļ¬nd("ļ¬stName eq John");

    events      conferences = john.allConferences;

                JohnJSConferences = conferences.filter("title eq :1", "*JavaScript*");


    methods     JSAttendeesJohnMet = JSConferences.allPeople;


                         http://wakanda.org/
Multi-Model
ArangoDB

V8                  actions.defineHttp({
                      url : "world",
                      context : "api",


     events
                        callback : function (req, res) {
                          var collection = db._collection(req.parameter.collection);

                           if (collection == null) {
                             ...


     ļ¬lters
                           }
                           else {
                             ...
                           }



     transactions
                           actions.resultOk(req, res, actions.HTTP_OK, result);
                      }
                    });




Shell

                    http://www.ape-project.org/
OrientDB

rhino
                                                                 // create function getAllCustomer

REST / JSON
                                                                 return db.query("select from V")




transactions                                                          db.begin();
                                                                      try {
                                                                      "   // some code
                                                                      "   db.commit()

hooks (events)                                                        } catch (e) {
                                                                      "
                                                                      }
                                                                          db.rollback();"




stored procedures
new com.orientechnologies.orient.core.record.impl.ODocument('Profile').field('name', 'Luca').save()



                                      http://www.orientdb.org/
Reaching the DB
Reaching the DB
mongoose                       WAF (Wakanda)

mongodb-rhino                  Ext.data.proxy.Wakanda

riak control                   arango.client

backbone-couchdb               voltdb-client-nodejs

dojox.data.couchDBRestStore    redis-node-client

node-cassandra                 orientdb-api.js
Thank you!
Letā€™s keep in touch...

                                         Client & Server
    @amorgaut
                                         JavaScript APIs
    http://about.me/amorgaut   http://w3.org/community/jseverywhere/


    @wakandasoft                        @jseverywhere
    http://wakanda.org                  http://jseverywhere.org

More Related Content

What's hot

Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackGaryCoady
Ā 
Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDBJeff Yemin
Ā 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDBJames Williams
Ā 
What istheservicestack
What istheservicestackWhat istheservicestack
What istheservicestackDemis Bellot
Ā 
Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBTobias Trelle
Ā 
Cutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryCutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryWilliam Candillon
Ā 
Using Grails to power your electric car
Using Grails to power your electric carUsing Grails to power your electric car
Using Grails to power your electric carMarco Pas
Ā 
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Ø
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Øļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Ø
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Øiammutex
Ā 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
Ā 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for CassandraEdward Capriolo
Ā 
High Performance Core Data
High Performance Core DataHigh Performance Core Data
High Performance Core DataMatthew Morey
Ā 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatchcqtt191
Ā 
Scalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBScalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBWilliam Candillon
Ā 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaMongoDB
Ā 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDBScott Hernandez
Ā 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design PatternsWilliam Candillon
Ā 
MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaScott Hernandez
Ā 
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼HyeonSeok Choi
Ā 

What's hot (19)

Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
Ā 
Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDB
Ā 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDB
Ā 
What istheservicestack
What istheservicestackWhat istheservicestack
What istheservicestack
Ā 
Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDB
Ā 
Cutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryCutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQuery
Ā 
Using Grails to power your electric car
Using Grails to power your electric carUsing Grails to power your electric car
Using Grails to power your electric car
Ā 
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Ø
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Øļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Ø
ļæ¼MongoDB åœØē››å¤§å¤§ę•°ę®é‡äø‹ēš„åŗ”ē”Ø
Ā 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
Ā 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
Ā 
High Performance Core Data
High Performance Core DataHigh Performance Core Data
High Performance Core Data
Ā 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatch
Ā 
Scalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBScalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDB
Ā 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with Morphia
Ā 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDB
Ā 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design Patterns
Ā 
MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with Morphia
Ā 
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼
Node į„€į…Ŗį†«į„€į…Øį„’į…§į†¼ į„ƒį…¦į„‹į…µį„į…„į„‡į…¦į„‹į…µį„‰į…³_į„‡į…”į„‹į…µį†«į„ƒį…µį†¼
Ā 
Dropwizard
DropwizardDropwizard
Dropwizard
Ā 

Similar to NoSQL and JavaScript: a love story

State of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSState of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSAlexandre Morgaut
Ā 
State of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsState of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsAlexandre Morgaut
Ā 
State of the art server side java script
State of the art server side java scriptState of the art server side java script
State of the art server side java scriptThibaud Arguillere
Ā 
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...GITS Indonesia
Ā 
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"Provectus
Ā 
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Alexandre Morgaut
Ā 
State of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSState of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSAlexandre Morgaut
Ā 
12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine12 Monkeys Inside JS Engine
12 Monkeys Inside JS EngineChengHui Weng
Ā 
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Alexandre Morgaut
Ā 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.Mike Brevoort
Ā 
Hybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaHybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaAyman Mahfouz
Ā 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitAriya Hidayat
Ā 
Full-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsFull-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsMichael Lehmann
Ā 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
Ā 
JBoss World 2010
JBoss World 2010JBoss World 2010
JBoss World 2010Chris Ramsdale
Ā 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitAriya Hidayat
Ā 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitAriya Hidayat
Ā 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAriya Hidayat
Ā 

Similar to NoSQL and JavaScript: a love story (20)

State of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSState of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJS
Ā 
State of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsState of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljs
Ā 
State of the art server side java script
State of the art server side java scriptState of the art server side java script
State of the art server side java script
Ā 
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Ā 
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"
Š’Š°ŃŠøŠ»ŠµŠ²ŃŠŗŠøŠ¹ Š˜Š»ŃŒŃ (Fun-box): "Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†Šøя Š±Ń€Š°ŃƒŠ·ŠµŃ€Š° ŠæрŠø ŠæŠ¾Š¼Š¾Ń‰Šø PhantomJS"
Ā 
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Ā 
GlassFish v3 : En Route Java EE 6
GlassFish v3 : En Route Java EE 6GlassFish v3 : En Route Java EE 6
GlassFish v3 : En Route Java EE 6
Ā 
React october2017
React october2017React october2017
React october2017
Ā 
State of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSState of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJS
Ā 
12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine
Ā 
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Ā 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.
Ā 
Hybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaHybrid apps - Your own mini Cordova
Hybrid apps - Your own mini Cordova
Ā 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
Ā 
Full-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsFull-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.js
Ā 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
Ā 
JBoss World 2010
JBoss World 2010JBoss World 2010
JBoss World 2010
Ā 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKit
Ā 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKit
Ā 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile Web
Ā 

More from Alexandre Morgaut

Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Alexandre Morgaut
Ā 
Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Alexandre Morgaut
Ā 
angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42Alexandre Morgaut
Ā 
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012Carnet de Route du DĆ©veloppeur - ENSIMAG 2012
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012Alexandre Morgaut
Ā 
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Alexandre Morgaut
Ā 
HTML5 in automotive - web2day 2014
HTML5 in automotive  - web2day 2014HTML5 in automotive  - web2day 2014
HTML5 in automotive - web2day 2014Alexandre Morgaut
Ā 
JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)Alexandre Morgaut
Ā 
Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Alexandre Morgaut
Ā 
End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013Alexandre Morgaut
Ā 
From Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaFrom Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaAlexandre Morgaut
Ā 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Alexandre Morgaut
Ā 
End to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeEnd to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeAlexandre Morgaut
Ā 
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeWakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeAlexandre Morgaut
Ā 
End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012Alexandre Morgaut
Ā 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveAlexandre Morgaut
Ā 
NantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeNantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeAlexandre Morgaut
Ā 
Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Alexandre Morgaut
Ā 
Benefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaBenefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaAlexandre Morgaut
Ā 
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...Alexandre Morgaut
Ā 

More from Alexandre Morgaut (20)

Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Ā 
Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017
Ā 
angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42
Ā 
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012Carnet de Route du DĆ©veloppeur - ENSIMAG 2012
Carnet de Route du DĆ©veloppeur - ENSIMAG 2012
Ā 
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Ā 
HTML5 in automotive - web2day 2014
HTML5 in automotive  - web2day 2014HTML5 in automotive  - web2day 2014
HTML5 in automotive - web2day 2014
Ā 
JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)
Ā 
Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)
Ā 
End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013
Ā 
From Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaFrom Web App Model Design to Production with Wakanda
From Web App Model Design to Production with Wakanda
Ā 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29
Ā 
End to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeEnd to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) Europe
Ā 
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeWakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Ā 
End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012
Ā 
End-to-end W3C APIs
End-to-end W3C APIsEnd-to-end W3C APIs
End-to-end W3C APIs
Ā 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS Geneve
Ā 
NantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeNantesJS premier meetup - Welcome
NantesJS premier meetup - Welcome
Ā 
Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011
Ā 
Benefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaBenefits of an Open environment with Wakanda
Benefits of an Open environment with Wakanda
Ā 
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
Ā 

Recently uploaded

EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
Ā 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
Ā 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
Ā 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
Ā 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
Ā 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
Ā 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vƔzquez
Ā 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
Ā 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
Ā 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
Ā 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
Ā 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
Ā 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
Ā 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
Ā 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
Ā 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
Ā 

Recently uploaded (20)

EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
Ā 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Ā 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
Ā 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
Ā 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Ā 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Ā 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
Ā 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Ā 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Ā 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
Ā 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
Ā 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
Ā 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Ā 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Ā 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Ā 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
Ā 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
Ā 

NoSQL and JavaScript: a love story

  • 1. NoSQL & JavaScript a Love Story! by Alexandre Morgaut TakeOff Conf - Lille 2013
  • 2. Presentation W3C AC member Wakanda Community Web Architect JS Expert REST Lover NoSQL Fanboy @amorgaut
  • 4. NoSQL Facts Mostly Schemaless Often with REST / JSON API Many store JSON Many embed a JavaScript engine Map / Reduce events Many propose a JavaScript Shell
  • 5. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 6. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 7. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 9. JavaScript Facts Created in 1995 Running in Netscape Server in 1996, and then in IIS Mostly Event-Driven Recommended in the REST deļ¬nition in 2000 Integrated in CouchDB in 2007 HTML5 Datastores appeared in 2009
  • 10. JavaScript Engines C+ C + SpiderMonkey webkit JavaScriptCore: JSC 3 JIT Compilers: SquirrelFish Extreme: SFX aka Nitro TraceMonkey, (JIT Compiler inside) JƤgerMonkey, IonMonkey Jav C+ a + Rhino V8 Interpreted or Compiled execution JIT Compiler: CrankShaft Nashorn? ? Trident: MSHTML Chakra -> Classic JScript, Managed JScript, & JScript.NET C+ ? + Tamarin Carakan JIT Compiler: NanoJIT -> ActionScript / ā€œECMAScript 4ā€ Previously: Linear A, Linear B, Futhark
  • 11. Server-Side JavaScript SpiderMonkey JavaScriptCore Rhino V8 Trident / Chakra
  • 13. JavaScript & Databases Netscape Enterprise Server Microsoft: JScript, JScript.NET, ActiveX Mozilla Rhino JSDB APE Project W3C Web SQL
  • 14. Netscape Enterprise Server SQLTable() pool = new DbPool("ORACLE", addr, user, pwd, "", 5, true); connection = pool.connection("A connection"); cursor = connection.cursor("select name from customer"); DbPool if ( cursor && (connection.majorErrorCode() == 0) ) { // Get the first row cursor.next(); // Display the values write("<B>Customer Name:</B> " + cursor.name + "<BR>"); start/home.html } //Close the cursor cursor.close(); Shared Connections Note: Netscape Enterprise Server merged with Javagator to become iPlanet
  • 15. MS JScript on the server conn = Server.CreateObject("ADODB.Connection"); Active Server Page conn.Open(dsn, login, password); reccordset = conn.Execute(sqlQuery); result = []; runat=ā€serverā€ while (!reccordset.EOF) { result.push({ field1: reccordset("field1"), field2: reccordset("field2") Windows Script Hosting }); rsAuthor2.MoveNext; } .NET conn.Close(); conn = null; Note: JScript is running on Microsoft IIS since 1997
  • 16. MS JScript in the Browser var connection = new ActiveXObject("ADODB.Connection"); Ā Ā  connection.Open(dsn, login, password); var reccordset = new ActiveXObject("ADODB.Recordset"); ActiveXObject Ā  reccordset.Open(sqlQuery, connection); reccordset.MoveFirst; while(!reccordset.eof) { only IE } document.write(reccordset.fields(1)); reccordset.movenext; Ā  reccordset.close; connection.close;
  • 17. Mozilla Rhino importPackage(java.sql); java.lang.Class.forName("org.sqlite.JDBC"); Java environment conn = DriverManager.getConnection("jdbc:sqlite:test.db"); stat = conn.createStatement(); resultSet = stat.executeQuery("select * from people;"); while (resultSet.next()){ Access to JDBC print( resultSet.getString("name") + " - " + resultSet.getString("occupation") ); ex: RingoJS } resultSet.close(); stat.close(); conn.close(); https://developer.mozilla.org/en-US/docs/Rhino
  • 18. JSDB var db = new ODBC(dsn); var result = db.query("select * from mytable"); SpiderMonkey var searcher = new Index; for (var i=1; i <= result.count; i++) { searcher.add(result.get('NAME')); } Shell var i = searcher.find('Mr. Smith'); var r = result.getRow(i + 1); writeln('Data for Mr. Smith'); writeln(r.toString()); JS Server db.close(); http://www.jsdb.org/
  • 19. APE Project var sql = new Ape.MySQL(ip + ":3306", user, password, db); Ape.registerCmd('foo', true, function(params, cmd) { Real Time Web cmd.user.sendRaw( 'bar', { hello: 'world', echo: params.ping Comet } ); sql.query( 'INSERT INTO table(log) VALUES("' + Web Sockets Ape.MySQL.escape(params.ping) + '")', function(res, errorNo) { Ape.log('Inserted ' + this.getInsertId()); } MySQL ); }); Note: APE means ā€œAjax Push Engineā€ http://www.ape-project.org/
  • 20. W3C Web SQL HTML5 var db = openDatabase('mydb', '1.0', 'my first db', 2 * 1024 * 1024); db.transaction(function (tx) { Safari tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)'); tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")'); }); Chrome tx.executeSql('SELECT * FROM foo', [], function (tx, results) { for (var i = 0, len = results.rows.length; i < len; i++) { alert(results.rows.item(i).text); } }); Opera result = x.executeSqlSync('SELECT * FROM foo'); for (var i = 0, len = results.rows.length; i < len; i++) { alert(results.rows.item(i).text); Sync / Async } Note: standard paused because current implementations are only based on SQLite http://html5doctor.com/introducing-web-sql-databases/
  • 21. Data as a Service (DaaS)
  • 22. Data as a Service Amazon APIs OData APP GData Twitter APIs
  • 24. Touching the DB Heart Key-Value: Web Storage, Riak Document: CouchDB, MongoDB, IndexedDB Object: JavaScriptDB, WakandaDB Multi-Model: OrientDB & ArangoDB
  • 26. Web Storage W3C / WHATWG // set or get items by methods localStorage.setItem("storedItem", "value"); var value = localStorage.getItem("storedItem"); HTML5 // set or get items using the store as a map localStorage.storedItem = value; var value = localStorage.storedItem; local // accessible only for this session var foo = sessionStorage.bar; sessionStorage.bar = foo; session // sync interface when data change, even from other window window.addEventListener("storage", handle_storage, false); events Note: Firefox used to propose ā€œglobalStorageā€, Wakanda implements ā€œuser.storageā€ http://www.w3.org/TR/webstorage/
  • 27. Riak Buckets {"inputs": "goog", "query": [ {"map": {"language": "javascript", "source": "function(value, keyData, arg){...}" }}, REST / JSON {"reduce": {"language": "javascript", "source": "function(values, arg){...}", "keep": true }} ] } Map / Reduce // Map: compute the daily variance, key it by the month function(value, keyData, arg){ Erlang alternative: var data = Riak.mapValuesJson(value)[0]; var month = value.key.split('-').slice(0,2).join('-'); var obj = {}; obj[month] = data.High - data.Low; return [ obj ]; SpiderMonkey } // Reduce: find the maximum variance per month function(values, arg) { return [values.reduce(function(acc, item){ for (var month in item) { acc[month] = acc[month] ? Math.max(item[month], acc[month]) : item[month]; } return acc; })]; }
  • 29. IndexedDB W3C / WHATWG var request = indexedDB.open("MyTestDatabase", 3); request.onerror = function(event) { // Do something with request.errorCode! HTML5 }; request.onsuccess // Do something = function(event) { with request.result! }; Sync / Async request.onupgradeneeded = function(event) { // Update object stores and indices .... } Indexes var objectStore = db.createObjectStore("customers", { keyPath: "ssn" }); objectStore.createIndex("name", "name", { unique: false }); Transactions objectStore.add({ ssn: "444-44-4444", name: "Bill", age: 35}); var transaction = db.transaction(["customers"], IDBTransaction.READ_WRITE); Cursors http://www.w3.org/TR/IndexedDB/
  • 30. CouchDB function(doc) { if (doc.Type == "customer") { emit(doc.LastName, {FirstName: doc.FirstName, Addr: doc.Address}); emit(doc.FirstName, {LastName: doc.LastName, Addr: doc.Address}); Views } } JSON* { "total_rows":2, "offset":0, "rows": [ Map / Reduce { "id":"64ACF01B05F53ACFEC48C062A5D01D89", "key":"Katz", "value":{"FirstName":"Damien", "Addr":"Charlotte NC"} }, { Erlang alternative: "id":"64ACF01B05F53ACFEC48C062A5D01D89", "key":"Damien", "value":{"LastName":"Katz", "Addr":"Charlotte NC"} }, ] Spidermonkey } Note: CouchDB moved from XML to JSON & JS in 2007* http://wiki.apache.org/couchdb/HTTP_view_API * http://jan.prima.de/~jan/plok/archives/89-CouchDb-updates.html
  • 31. CouchBase CouchDB alternative using V8 adding memcache meant to be more scalable http://www.couchbase.com/
  • 32. MongoDB { text: "lmao! great article!", Spidermonkey } author: 'kbanker', votes: 2 BSON var map = function() { emit(this.author, {votes: this.votes}); }; Map / Reduce // Add up all the votes for each key. var reduce = function(key, values) { var sum = 0; REST / JSON values.forEach(function(doc) { sum += doc.votes; }); return {votes: sum}; }; REST / JS var op = db.comments.mapReduce(map, reduce, {out: "mr_results"}); Shell http://www.mongodb.org/display/DOCS/MapReduce
  • 34. Persevere JavaScriptDB var d = new Data(); d.test = 12345; Rhino {"id":"generated.js", "sources":[ { "name":"Data", "extends":"Object", REST / JSON "schema":{ "extends":{"$ref":"../Class/Object"}, hello : function() { console.log("hello hi"); }, JSON Schema } "prototype":{ } }] JSON Path } curl localhost:8080/Data/1 JSON Query ({"id":"1","test":12345}) Data.hello(); // INFO: hi there http://www.sitepen.com/blog/2009/04/20/javascriptdb-perseveres-new-high-performance-storage-engine/
  • 35. WakandaDB Webkit JavaScriptCore REST / JSON Data Classes auto-updatable accessors john = ds.Person.ļ¬nd("ļ¬stName eq John"); events conferences = john.allConferences; JohnJSConferences = conferences.filter("title eq :1", "*JavaScript*"); methods JSAttendeesJohnMet = JSConferences.allPeople; http://wakanda.org/
  • 37. ArangoDB V8 actions.defineHttp({ url : "world", context : "api", events callback : function (req, res) { var collection = db._collection(req.parameter.collection); if (collection == null) { ... ļ¬lters } else { ... } transactions actions.resultOk(req, res, actions.HTTP_OK, result); } }); Shell http://www.ape-project.org/
  • 38. OrientDB rhino // create function getAllCustomer REST / JSON return db.query("select from V") transactions db.begin(); try { " // some code " db.commit() hooks (events) } catch (e) { " } db.rollback();" stored procedures new com.orientechnologies.orient.core.record.impl.ODocument('Profile').field('name', 'Luca').save() http://www.orientdb.org/
  • 40. Reaching the DB mongoose WAF (Wakanda) mongodb-rhino Ext.data.proxy.Wakanda riak control arango.client backbone-couchdb voltdb-client-nodejs dojox.data.couchDBRestStore redis-node-client node-cassandra orientdb-api.js
  • 41. Thank you! Letā€™s keep in touch... Client & Server @amorgaut JavaScript APIs http://about.me/amorgaut http://w3.org/community/jseverywhere/ @wakandasoft @jseverywhere http://wakanda.org http://jseverywhere.org