This document discusses integrating Scala and MongoDB. It begins with an introduction to MongoDB, describing it as a document-oriented database that uses JSON-like documents and favors embedding related data over foreign keys. It supports various platforms and has a rich query interface. The document then outlines several Scala drivers for MongoDB, including mongo-scala-driver, lift-mongo, and casbah. It also discusses using STM with MongoDB via Akka. Finally, it notes that MongoDB provides native APIs for various languages to interact with it in a way adapted to each language.
This document provides an overview of integrating Scala and MongoDB. It begins with introductions to Scala and MongoDB individually, including their key features. It then discusses how Scala and MongoDB can be combined effectively, covering Scala driver libraries for MongoDB like lift-mongo and casbah. It also mentions how Scala's software transactional memory (STM) can be used with MongoDB via Akka. The document aims to illustrate how Scala and MongoDB can work well together.
Briefly: Scala Implicits, Pimp My Library and Java Interopbwmcadams
This document discusses techniques for improving interoperability between Scala and Java, including implicits, pimp my library patterns, and conversion helpers. It describes how Scala 2.7 had limited support for converting between Java and Scala collections but Scala 2.8 improved this with scala.collection.JavaConversions. Implicits allow adding new methods to existing classes at compile-time by defining implicit conversions or arguments.
EasyData is an open source object-relational mapping tool for .NET that enables developers to use databases like SQL Server, MySQL, and Oracle. It supports basic CRUD operations and relationships between entities. While it provides many core ORM features, the project had some limitations including incomplete support for advanced features like aggregations and its own query language. Future enhancements could optimize performance and flexibility.
The Java Naming and Directory Interface (JNDI) allows Java applications to look up and discover named objects in a directory service. JNDI provides a standard interface for naming and accessing resources such as databases. Distributed application components can use JNDI to locate other components and resources by name. The JNDI lookup method passes a name and returns the associated object, enabling access to resources without prior knowledge of implementation details or location.
This document provides an overview of Spring Data and its support for MongoDB. Spring Data provides common repositories and abstraction for data access across NoSQL and SQL databases. It includes the MongoRepository interface which provides basic CRUD functionality for MongoDB. Custom queries can be written for MongoDB through the MongoRepository interface. Spring Data also includes the MongoTemplate class which provides a template-based API for MongoDB similar to its native driver.
The document discusses Java Naming and Directory Interface (JNDI), which provides a standard interface for Java applications to access naming and directory services. JNDI allows Java programs to lookup and bind objects to names and addresses. It provides a common way to access different directory services like LDAP, DNS, and file systems through a single API.
Scala Next focused on the continued adoption and development of Scala. Key points included:
- Scala adoption has grown significantly in areas like web platforms, trading platforms, and financial modeling. The number of Scala jobs tripled in the last year.
- Recent Scala versions like 2.8 and 2.9 included improvements to collections, implicits, and tooling support.
- Scala 2.10 will focus on new reflection capabilities, reification, string interpolation, and continued IDE improvements.
- The Play Framework 2.0 will provide a Scala-centric web framework built on top of Akka and the Typesafe Stack.
This document discusses JNDI (Java Naming and Directory Interface) and how it provides a common way to access distributed and local resources for enterprise applications. It covers the basics of JNDI, including getting an initial context, looking up objects in the JNDI tree, adding and removing objects, and using JNDI for local data access and singletons. It also discusses how JNDI can be used with CORBA objects and for narrowing object references.
This document provides an overview of integrating Scala and MongoDB. It begins with introductions to Scala and MongoDB individually, including their key features. It then discusses how Scala and MongoDB can be combined effectively, covering Scala driver libraries for MongoDB like lift-mongo and casbah. It also mentions how Scala's software transactional memory (STM) can be used with MongoDB via Akka. The document aims to illustrate how Scala and MongoDB can work well together.
Briefly: Scala Implicits, Pimp My Library and Java Interopbwmcadams
This document discusses techniques for improving interoperability between Scala and Java, including implicits, pimp my library patterns, and conversion helpers. It describes how Scala 2.7 had limited support for converting between Java and Scala collections but Scala 2.8 improved this with scala.collection.JavaConversions. Implicits allow adding new methods to existing classes at compile-time by defining implicit conversions or arguments.
EasyData is an open source object-relational mapping tool for .NET that enables developers to use databases like SQL Server, MySQL, and Oracle. It supports basic CRUD operations and relationships between entities. While it provides many core ORM features, the project had some limitations including incomplete support for advanced features like aggregations and its own query language. Future enhancements could optimize performance and flexibility.
The Java Naming and Directory Interface (JNDI) allows Java applications to look up and discover named objects in a directory service. JNDI provides a standard interface for naming and accessing resources such as databases. Distributed application components can use JNDI to locate other components and resources by name. The JNDI lookup method passes a name and returns the associated object, enabling access to resources without prior knowledge of implementation details or location.
This document provides an overview of Spring Data and its support for MongoDB. Spring Data provides common repositories and abstraction for data access across NoSQL and SQL databases. It includes the MongoRepository interface which provides basic CRUD functionality for MongoDB. Custom queries can be written for MongoDB through the MongoRepository interface. Spring Data also includes the MongoTemplate class which provides a template-based API for MongoDB similar to its native driver.
The document discusses Java Naming and Directory Interface (JNDI), which provides a standard interface for Java applications to access naming and directory services. JNDI allows Java programs to lookup and bind objects to names and addresses. It provides a common way to access different directory services like LDAP, DNS, and file systems through a single API.
Scala Next focused on the continued adoption and development of Scala. Key points included:
- Scala adoption has grown significantly in areas like web platforms, trading platforms, and financial modeling. The number of Scala jobs tripled in the last year.
- Recent Scala versions like 2.8 and 2.9 included improvements to collections, implicits, and tooling support.
- Scala 2.10 will focus on new reflection capabilities, reification, string interpolation, and continued IDE improvements.
- The Play Framework 2.0 will provide a Scala-centric web framework built on top of Akka and the Typesafe Stack.
This document discusses JNDI (Java Naming and Directory Interface) and how it provides a common way to access distributed and local resources for enterprise applications. It covers the basics of JNDI, including getting an initial context, looking up objects in the JNDI tree, adding and removing objects, and using JNDI for local data access and singletons. It also discusses how JNDI can be used with CORBA objects and for narrowing object references.
The document discusses OrientDB, a multi-model NoSQL database that supports document, key-value, and graph structures. It highlights several of OrientDB's features, including its support for relationships without joins, complex types, ACID transactions, and its RESTful HTTP interface. The document also briefly describes OrientDB's indexing, security, multi-master replication, and use of a graph database model.
This document discusses naming and directory services, including JNDI. JNDI provides a way for Java clients to access naming and directory services to lookup and locate remote services and components. A naming service contains objects and references mapped to names, while a directory service associates attributes with bindings. Popular directory services include LDAP, NDS, NIS+, RMI Registry, CORBA Naming Service, and DNS. JNDI configuration can be difficult but is simplified when using an application server which automatically starts required services.
Writing Efficient Java Applications For My Sql Cluster Using NdbjMySQLConference
This document provides an overview of writing efficient Java applications for MySQL Cluster using the NDB/J API. It covers the basics of MySQL Cluster and the NDB API, including connecting to the database, performing transactions, and different types of operations. It also discusses converting SQL queries to NDB operations, handling errors, scanning and filtering results, and some advanced features like asynchronous transactions and event handling.
Polygot persistence for Java Developers - August 2011 / @OakjugChris Richardson
Relational databases have long been considered the one true way to persist enterprise data. But today, NoSQL databases are emerging as a viable alternative for many applications. They can simplify the persistence of complex data models and offer significantly better scalability, and performance. But NoSQL databases are very different than the ACID/SQL/JDBC/JPA world that we have become accustomed to. In this presentation, you will learn about our experience implementing a use case from POJOs in Action using popular NoSQL databases: Redis, MongoDB, and Cassandra. We will compare and contrast each database’s data model and Java API. You will learn about the benefits and drawbacks of using NoSQL.
using Spring and MongoDB on Cloud FoundryJoshua Long
This talk introduces how to build MongoDB applications with Spring Data MongoDB on Cloud Foundry. Spring Data provides rich support for easily building applications that work on multiple data stores.
MongoDB is a document-oriented database that stores data in JSON-like documents. It features high performance, high availability, easy scalability, and a rich query language. Data is stored in flexible, schema-less documents which reduces the need for joins. MongoDB uses replication and automatic sharding for high availability and easy scalability.
(Big) Data Serialization with Avro and ProtobufGuido Schmutz
The document describes data serialization formats Avro and Protobuf. It provides an overview of their schema definition approaches, data types, code generation capabilities, and usage from Java. Key differences noted are Protobuf uses field numbers while Avro relies on schemas and uses variable length encoding. The document also shows examples of defining schemas in IDL format and generating/serializing data from Java code.
Scaling up and accelerating Drupal 8 with NoSQLOSInet
Drupal 8 can scale well and serve pages fast to many users, especially by offloading parts of the work load from the main SQL database to NoSQL solutions.
This presentation describes the strategies and technologies usable to achieve such gains, including specific configuration, contributed modules and custom coding strategies.
The document discusses optimizing Drupal using MongoDB. It provides an agenda for the discussion, including an introduction to MongoDB and how to install and configure it for use with Drupal. The benefits of using MongoDB with Drupal are highlighted, with a focus on speed, scale, and simplicity compared to traditional SQL databases. Examples are given showing how document-based data storage in MongoDB can more flexibly support different data models compared to relational databases.
BedCon 2013 - Java Persistenz-Frameworks für MongoDBTobias Trelle
This document discusses different Java frameworks for working with MongoDB:
- The MongoDB Java driver allows direct communication with MongoDB but requires manual handling of documents.
- Spring Data MongoDB provides object mapping, repository interfaces and templates to simplify MongoDB access from Java.
- Hibernate OGM implements a subset of the JPA specification and allows MongoDB access using JPA concepts and JPQL queries.
A flexible plugin like data layer - decouple your -_application logic from yo...MongoDB
The document discusses decoupling application logic from data storage by implementing a plugin-like data layer. It describes how Pixable migrated their data storage from MySQL to MongoDB using this approach, allowing them to move data incrementally while maintaining service. The document outlines the benefits of this decoupled architecture, including easy integration of new data sources and balancing load across storage engines. It also notes some cons like increased queries and code complexity.
Slides of my "Rapid JCR applications development with Sling" at ApacheCon EU 2009. Starts like the US 2008 version but uses a different example for the second part.
Enterprise applications are complex making it difficult to fit everything in one model. NoSQL is taking a leading role in the next generation database technologies and polyglot persistence a good option to leverage the strength of multiple data stores. This talk will introduce the Spring Data project, an umbrella project that provides a familiar and consistent Spring-based programming model for a wide range of data access technologies such as Redis, MongoDB, HBase, Neo4j...while retaining store-specific features and capabilities.
Some slides, as presented during EKON20 conferences, about the mORMot Open Source project, a Delphi/FPC professional framework featuring highly integrated SOA, MVC, ORM, SOLID over SQL and NoSQL databases.
20140614 introduction to spark-ben whiteData Con LA
This document provides an introduction to Apache Spark. It begins by explaining how Spark improves upon MapReduce by leveraging distributed memory for better performance and supporting iterative algorithms. Spark is described as a general purpose computational framework that retains the advantages of MapReduce like scalability and fault tolerance, while offering more functionality through directed acyclic graphs and libraries for machine learning. The document then discusses getting started with Spark and its execution modes like standalone, YARN client, and YARN cluster. Finally, it introduces Spark concepts like Resilient Distributed Datasets (RDDs), which are collections of objects partitioned across a cluster.
The document discusses Java updates in JDK 9, with highlights including:
- Modularity improvements like modular source code and modular run-time images.
- Developer convenience features such as simplified Doclet API and Java shell.
- Diagnostic updates like standardized GC logging and additional diagnostic commands.
- Removal of some deprecated JVM options and garbage collector combinations.
- Updates to strings, Javadoc, JavaScript/HTTP support, and various native platform improvements.
This document discusses using the Neo4J graph database with Grails. It provides an overview of NoSQL databases and why graph databases are useful. It then discusses Neo4J specifically and how its data model is suited to connected data. The document outlines how to install the Neo4J plugin for Grails and use GORM to work with Neo4J. It also discusses advanced configurations like embedded, REST, and high availability modes.
First slide of Hadoop:
* Introduction to Big Data and Hadoop:
- Presenting and defining big data
- Introducing Hadoop and History
- Hadoop - how it works?
- HDFS
This document discusses OrientDB, an open source NoSQL document database. It provides high performance and scalability through horizontal scaling across servers. It supports flexible schemas, full text search, and graph-like connections between data. The document describes OrientDB's products, data model using clusters, Java and RESTful APIs, examples using records and POJOs, and security features.
The document discusses a content repository, which is a generic API for content storage that provides CRUD functionality as well as versioning, transactions, and search capabilities. It describes how a content repository enforces simplicity, encourages standardization, and improves scalability. Examples of content repository implementations are provided, including Apache Jackrabbit and eXo Platform. Key features of content repositories are explored such as the content model, repository structure with workspaces and nodes/properties, and node type definitions.
These are the slides from the presentation I gave to the Sencha meetup group in Austin, TX. It covers the NoSQL-NodeJS-ExtJS development stack at a high level.
Node Js, AngularJs and Express Js TutorialPHP Support
This document provides an overview of the Node.js, Express.js, AngularJS, and MongoDB technologies and how they can be used together. It discusses what each technology is, its features and uses. Node.js is a JavaScript runtime built on Chrome's V8 engine for building fast network applications. Express.js is a web framework built on Node.js that simplifies building web apps. AngularJS is a JavaScript framework for building dynamic web apps. MongoDB is a popular open-source NoSQL database that stores data in JSON-like documents.
The document discusses OrientDB, a multi-model NoSQL database that supports document, key-value, and graph structures. It highlights several of OrientDB's features, including its support for relationships without joins, complex types, ACID transactions, and its RESTful HTTP interface. The document also briefly describes OrientDB's indexing, security, multi-master replication, and use of a graph database model.
This document discusses naming and directory services, including JNDI. JNDI provides a way for Java clients to access naming and directory services to lookup and locate remote services and components. A naming service contains objects and references mapped to names, while a directory service associates attributes with bindings. Popular directory services include LDAP, NDS, NIS+, RMI Registry, CORBA Naming Service, and DNS. JNDI configuration can be difficult but is simplified when using an application server which automatically starts required services.
Writing Efficient Java Applications For My Sql Cluster Using NdbjMySQLConference
This document provides an overview of writing efficient Java applications for MySQL Cluster using the NDB/J API. It covers the basics of MySQL Cluster and the NDB API, including connecting to the database, performing transactions, and different types of operations. It also discusses converting SQL queries to NDB operations, handling errors, scanning and filtering results, and some advanced features like asynchronous transactions and event handling.
Polygot persistence for Java Developers - August 2011 / @OakjugChris Richardson
Relational databases have long been considered the one true way to persist enterprise data. But today, NoSQL databases are emerging as a viable alternative for many applications. They can simplify the persistence of complex data models and offer significantly better scalability, and performance. But NoSQL databases are very different than the ACID/SQL/JDBC/JPA world that we have become accustomed to. In this presentation, you will learn about our experience implementing a use case from POJOs in Action using popular NoSQL databases: Redis, MongoDB, and Cassandra. We will compare and contrast each database’s data model and Java API. You will learn about the benefits and drawbacks of using NoSQL.
using Spring and MongoDB on Cloud FoundryJoshua Long
This talk introduces how to build MongoDB applications with Spring Data MongoDB on Cloud Foundry. Spring Data provides rich support for easily building applications that work on multiple data stores.
MongoDB is a document-oriented database that stores data in JSON-like documents. It features high performance, high availability, easy scalability, and a rich query language. Data is stored in flexible, schema-less documents which reduces the need for joins. MongoDB uses replication and automatic sharding for high availability and easy scalability.
(Big) Data Serialization with Avro and ProtobufGuido Schmutz
The document describes data serialization formats Avro and Protobuf. It provides an overview of their schema definition approaches, data types, code generation capabilities, and usage from Java. Key differences noted are Protobuf uses field numbers while Avro relies on schemas and uses variable length encoding. The document also shows examples of defining schemas in IDL format and generating/serializing data from Java code.
Scaling up and accelerating Drupal 8 with NoSQLOSInet
Drupal 8 can scale well and serve pages fast to many users, especially by offloading parts of the work load from the main SQL database to NoSQL solutions.
This presentation describes the strategies and technologies usable to achieve such gains, including specific configuration, contributed modules and custom coding strategies.
The document discusses optimizing Drupal using MongoDB. It provides an agenda for the discussion, including an introduction to MongoDB and how to install and configure it for use with Drupal. The benefits of using MongoDB with Drupal are highlighted, with a focus on speed, scale, and simplicity compared to traditional SQL databases. Examples are given showing how document-based data storage in MongoDB can more flexibly support different data models compared to relational databases.
BedCon 2013 - Java Persistenz-Frameworks für MongoDBTobias Trelle
This document discusses different Java frameworks for working with MongoDB:
- The MongoDB Java driver allows direct communication with MongoDB but requires manual handling of documents.
- Spring Data MongoDB provides object mapping, repository interfaces and templates to simplify MongoDB access from Java.
- Hibernate OGM implements a subset of the JPA specification and allows MongoDB access using JPA concepts and JPQL queries.
A flexible plugin like data layer - decouple your -_application logic from yo...MongoDB
The document discusses decoupling application logic from data storage by implementing a plugin-like data layer. It describes how Pixable migrated their data storage from MySQL to MongoDB using this approach, allowing them to move data incrementally while maintaining service. The document outlines the benefits of this decoupled architecture, including easy integration of new data sources and balancing load across storage engines. It also notes some cons like increased queries and code complexity.
Slides of my "Rapid JCR applications development with Sling" at ApacheCon EU 2009. Starts like the US 2008 version but uses a different example for the second part.
Enterprise applications are complex making it difficult to fit everything in one model. NoSQL is taking a leading role in the next generation database technologies and polyglot persistence a good option to leverage the strength of multiple data stores. This talk will introduce the Spring Data project, an umbrella project that provides a familiar and consistent Spring-based programming model for a wide range of data access technologies such as Redis, MongoDB, HBase, Neo4j...while retaining store-specific features and capabilities.
Some slides, as presented during EKON20 conferences, about the mORMot Open Source project, a Delphi/FPC professional framework featuring highly integrated SOA, MVC, ORM, SOLID over SQL and NoSQL databases.
20140614 introduction to spark-ben whiteData Con LA
This document provides an introduction to Apache Spark. It begins by explaining how Spark improves upon MapReduce by leveraging distributed memory for better performance and supporting iterative algorithms. Spark is described as a general purpose computational framework that retains the advantages of MapReduce like scalability and fault tolerance, while offering more functionality through directed acyclic graphs and libraries for machine learning. The document then discusses getting started with Spark and its execution modes like standalone, YARN client, and YARN cluster. Finally, it introduces Spark concepts like Resilient Distributed Datasets (RDDs), which are collections of objects partitioned across a cluster.
The document discusses Java updates in JDK 9, with highlights including:
- Modularity improvements like modular source code and modular run-time images.
- Developer convenience features such as simplified Doclet API and Java shell.
- Diagnostic updates like standardized GC logging and additional diagnostic commands.
- Removal of some deprecated JVM options and garbage collector combinations.
- Updates to strings, Javadoc, JavaScript/HTTP support, and various native platform improvements.
This document discusses using the Neo4J graph database with Grails. It provides an overview of NoSQL databases and why graph databases are useful. It then discusses Neo4J specifically and how its data model is suited to connected data. The document outlines how to install the Neo4J plugin for Grails and use GORM to work with Neo4J. It also discusses advanced configurations like embedded, REST, and high availability modes.
First slide of Hadoop:
* Introduction to Big Data and Hadoop:
- Presenting and defining big data
- Introducing Hadoop and History
- Hadoop - how it works?
- HDFS
This document discusses OrientDB, an open source NoSQL document database. It provides high performance and scalability through horizontal scaling across servers. It supports flexible schemas, full text search, and graph-like connections between data. The document describes OrientDB's products, data model using clusters, Java and RESTful APIs, examples using records and POJOs, and security features.
The document discusses a content repository, which is a generic API for content storage that provides CRUD functionality as well as versioning, transactions, and search capabilities. It describes how a content repository enforces simplicity, encourages standardization, and improves scalability. Examples of content repository implementations are provided, including Apache Jackrabbit and eXo Platform. Key features of content repositories are explored such as the content model, repository structure with workspaces and nodes/properties, and node type definitions.
These are the slides from the presentation I gave to the Sencha meetup group in Austin, TX. It covers the NoSQL-NodeJS-ExtJS development stack at a high level.
Node Js, AngularJs and Express Js TutorialPHP Support
This document provides an overview of the Node.js, Express.js, AngularJS, and MongoDB technologies and how they can be used together. It discusses what each technology is, its features and uses. Node.js is a JavaScript runtime built on Chrome's V8 engine for building fast network applications. Express.js is a web framework built on Node.js that simplifies building web apps. AngularJS is a JavaScript framework for building dynamic web apps. MongoDB is a popular open-source NoSQL database that stores data in JSON-like documents.
Using MongoDB For BigData in 20 MinutesAndrás Fehér
This document provides an overview of using MongoDB for big data applications. It describes what MongoDB is, including that it is a open-source, document-oriented NoSQL database. It then covers some key MongoDB concepts and features like replica sets for high availability, sharding for horizontal scaling, and using MapReduce and Apache Spark with MongoDB. The document concludes that MongoDB is a fast, flexible, and scalable database solution for big data, though deploying sharded clusters requires planning.
This document provides an overview of MongoDB including what it is, how it compares to relational databases, how it achieves scalability through sharding, and how to perform basic operations like installation, startup/shutdown, data modeling, and CRUD operations. It also covers JSON data format, indexing, and backup utilities.
Cassandra and MongoDB are both NoSQL databases. Cassandra is a high performance distributed database written in Java that stores data in a tabular format like SQL, while MongoDB is a document-oriented database written in C++ that stores data in JSON format. The document compares the two databases on various characteristics like data structure, scalability, availability, licensing and usage by companies. It also provides overviews of Cassandra's column-oriented data model and MongoDB's support for replication, high availability and auto-sharding.
MongoDB is an open-source NoSQL database that uses a document-based data model and provides high performance, high availability, and easy scalability. It uses collections and documents where collections are groups of documents similar to tables in a relational database.
Elasticsearch is a search engine built on Lucene that provides features for data storage, analysis, and search. It has a distributed architecture and uses JSON/REST APIs. Elasticsearch supports features like distributed search, high availability, multitenancy, and horizontal scaling but lacks some search functions compared to MongoDB.
MongoDB and Elasticsearch both support features like distributed architecture, high availability, and horizontal scaling but Elasticsearch has faster search speeds while MongoDB provides better support for different
Silicon Valley Code Camp: 2011 Introduction to MongoDBManish Pandit
This document provides an introduction and overview of MongoDB, a document-oriented NoSQL database. It discusses how MongoDB differs from relational databases, its support for schemaless documents and easy querying. Key concepts covered include collections, documents, inserting and querying data, and replication and scaling architectures like master-slave and replica sets. The document also touches on accessing MongoDB programmatically, object-document mappers, internal architecture details, administration, and comparisons to other NoSQL solutions.
This document provides an overview of MongoDB, Java, and Spring Data. It discusses how MongoDB is a document-oriented NoSQL database that uses JSON-like documents with dynamic schemas. It describes how the Java driver can be used to interact with MongoDB to perform CRUD operations. It also explains how Spring Data provides an abstraction layer over the Java driver and allows for object mapping and repository-based queries to MongoDB.
This document provides an introduction and agenda for a presentation on MongoDB 2.4 and Spring Data. The presentation will include a quick introduction to NoSQL and MongoDB, an overview of Spring Data's MongoDB support including configuration, templates, repositories and queries, and details on metadata mapping, aggregation functions, GridFS file storage and indexes in MongoDB.
MongoDB is an open-source document database, and the leading NoSQL database. Written in C++.
MongoDB has official drivers for a variety of popular programming languages and development environments. There are also a large number of unofficial or community-supported drivers for other programming languages and frameworks.
This document provides an overview of NoSQL databases and then discusses Amazon DynamoDB in more depth. It explains that NoSQL databases are an alternative to relational databases for certain data-intensive applications. It then discusses DynamoDB specifically, highlighting that it is a fully managed NoSQL database that provides fast and predictable performance, flexible data model, automatic scaling, and pay per request pricing. The document also provides examples of applications that were built on DynamoDB as part of a challenge.
This document provides an overview of NoSQL databases and then discusses Amazon DynamoDB in more depth. It explains that NoSQL databases are an alternative to relational databases for certain data-intensive applications. It then discusses DynamoDB specifically, highlighting that it is a fully managed NoSQL database that provides fast and predictable performance, flexible data model, automatic scaling, and pay per request pricing. The document also provides examples of applications that were built on DynamoDB as part of a challenge.
The document provides an introduction to NOSQL databases. It begins with basic concepts of databases and DBMS. It then discusses SQL and relational databases. The main part of the document defines NOSQL and explains why NOSQL databases were developed as an alternative to relational databases for handling large datasets. It provides examples of popular NOSQL databases like MongoDB, Cassandra, HBase, and CouchDB and describes their key features and use cases.
MongoDB is a document-oriented NoSQL database that stores data as JSON-like documents. It is schema-less, scales easily, supports dynamic queries on documents, and stores data in BSON format. MongoDB is good for high write loads, high availability, large and changing datasets. Installation is simple, and it supports replication and sharding for availability and scaling. Data can be embedded or referenced between documents. Indexes and text search are supported. Programming involves JavaScript and MongoDB methods.
MongoDB can be used to store and query document-oriented data, and provides scalability through horizontal scaling. The document stores provide more flexibility than relational databases by allowing dynamic schemas with embedded documents. MongoDB combines the rich querying of relational databases with the flexibility and scalability of NoSQL databases. It uses indexes to improve query performance and supports features like aggregation, geospatial queries, and text search.
Michael Bright presented on using MongoDB and Python. Some key points:
1) MongoDB is a document-oriented NoSQL database that uses JSON-like documents with dynamic schemas, horizontal scaling, and high performance. It provides an alternative to relational databases for applications that need flexibility and scalability.
2) PyMongo is the main Python driver for working with MongoDB, but there are also frameworks and ORMs that provide higher-level APIs. Basic operations like inserting, finding, updating, and deleting documents can be done from the Python shell or code.
3) MongoDB supports indexing, sorting, projections and aggregation to optimize queries. The aggregation framework provides data processing pipelines to transform and analyze data in MongoDB.
MongoDB is a horizontally scalable, schema-free, document-oriented NoSQL database. It stores data in flexible, JSON-like documents, allowing for easy storage and retrieval of data without rigid schemas. MongoDB provides high performance, high availability, and easy scalability. Some key features include embedded documents and arrays to reduce joins, dynamic schemas, replication and failover for availability, and auto-sharding for horizontal scalability.
MongoDB NoSQL database a deep dive -MyWhitePaperRajesh Kumar
This document provides an overview of MongoDB, a popular NoSQL database. It discusses why NoSQL databases were created, the different types of NoSQL databases, and focuses on MongoDB. MongoDB is a document-oriented database that stores data in JSON-like documents with dynamic schemas. It provides horizontal scaling, high performance, and flexible data models. The presentation covers MongoDB concepts like databases, collections, documents, CRUD operations, indexing, sharding, replication, and use cases. It provides examples of modeling data in MongoDB and considerations for data and schema design.
This document provides an overview and agenda for a MongoDB workshop. It begins with introductions and background on MongoDB. The agenda then covers basic CRUD operations and aggregation. It also discusses replication, sharding, and development uses for MongoDB. Replication in MongoDB uses replica sets for high availability and fault tolerance. Sharding partitions data across multiple servers to support large data volumes and high throughput. The document provides examples of shard key strategies and the production sharding architecture in MongoDB.
1. Scala with MongoDB
Brendan W. McAdams
Novus Partners, Inc.
New York Scala Enthusiasts
Aug. 8, 2010
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 1 / 60
2. Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 2 / 60
3. Introduction What is MongoDB?
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 3 / 60
4. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
5. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
6. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
7. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
8. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
9. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
10. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
11. Introduction What is MongoDB?
Introducing MongoDB
Categorized as a “Document-Oriented Database”
Features of both Key-Value Stores & RDBMS’
Rich query interface.
Works with JSON-like Documents
Favors embedding related data over “foreign key” relationships
Free license (A-GPL) cross-platform (Packages for Linux,
Windows, Mac OS X, Windows, FreeBSD & Solaris)
Cursor-based query results
ServerSide Javascript
Stored Javascript functions server-side
Powerful aggregation - Map/Reduce, Group Commands
JS Statements in queries (no indexes though)
Indexing system is much like RDBMS, includes Geospatial
support.
Scalable file storage with GridFS
Data scalability with Replica Sets & Autosharding
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 4 / 60
12. Introduction What is MongoDB?
Programming with MongoDB
Provides a native API which allows interaction to adapt to the
programming language (rather than vice versa).
Official drivers for. . .
C
C++
Java
JavaScript
Perl
PHP
Python
Ruby
Community supported drivers include. . .
.Net: C# & F#
JVM: Clojure, Scala, Groovy
Erlang
Haskell
Go
. . . and many more.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 5 / 60
13. Introduction What is MongoDB?
Programming with MongoDB
Provides a native API which allows interaction to adapt to the
programming language (rather than vice versa).
Official drivers for. . .
C
C++
Java
JavaScript
Perl
PHP
Python
Ruby
Community supported drivers include. . .
.Net: C# & F#
JVM: Clojure, Scala, Groovy
Erlang
Haskell
Go
. . . and many more.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 5 / 60
14. Introduction What is MongoDB?
Programming with MongoDB
Provides a native API which allows interaction to adapt to the
programming language (rather than vice versa).
Official drivers for. . .
C
C++
Java
JavaScript
Perl
PHP
Python
Ruby
Community supported drivers include. . .
.Net: C# & F#
JVM: Clojure, Scala, Groovy
Erlang
Haskell
Go
. . . and many more.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 5 / 60
15. Introduction What is MongoDB?
But is anyone actually *using* it?!?
MongoDB is deployed in production at companies including. . .
New York Times
Foursquare
bit.ly
SourceForge
Etsy
Disqus
Github
. . . The Large Hadron Collider.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 6 / 60
16. Introduction What is MongoDB?
But is anyone actually *using* it?!?
MongoDB is deployed in production at companies including. . .
New York Times
Foursquare
bit.ly
SourceForge
Etsy
Disqus
Github
. . . The Large Hadron Collider.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 6 / 60
17. Introduction A Taste of MongoDB
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 7 / 60
18. Introduction A Taste of MongoDB
Core Concepts
MongoDB’s equivalent to “tables” are called
“collections”;“collections” contain “documents” (individual pieces
of data)
Databases & Collections are lazy - they are created when first
inserted into.
MongoDB’s wire format/internal document representation is
BSON. . .
BSON is a binary optimized flavor of JSON; corrects JSON’s
inefficiency in string encoding (Base64).
Supports extras including Regular Expressions, Byte Arrays,
DateTimes & Timestamps, as well as datatypes for Javascript code
blocks & functions.
BSON implementation being split into its own package in most
drivers.
Creative Commons licensed http://bsonspec.org
Java driver represents BSON with a map-like DBObject (Which most Scala drivers use);
many dynamic languages (Perl, Ruby, Python, etc) use native dictionary objects.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 8 / 60
19. Introduction A Taste of MongoDB
The basics of Querying I
Find a single row with findOne(); returns the first document found
(by natural order).
You can find all documents matching your query with find(). No
query means you get the entire collection back.
Queries are specified as BSON documents to match against.
The find() and findOne() methods can take an optional second
DBObject specifying the fields to return.
If you have an embedded object (for example, an address object)
you can retrieve it with dot notation in the fields list (e.g.
“address.city” retrieves just the city value).
Use limit(), skip() and sort() on result objects (DBCursor in
Java-driver land) to adjust your results. These all return a new
cursor.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 9 / 60
20. Introduction A Taste of MongoDB
The basics of Querying II
distinct() can be used (on DBCollection to find all distinct values
for a given key; it returns a list of values.
> db.routes.findOne({"route_short_name": "E"})
{
"_id" : ObjectId("4c5f755608c3693f59580f8c"),
"route_id" : "E",
"agency_id" : "MTA NYCT",
"route_short_name" : "E",
"route_long_name" : "8 Avenue Local",
"route_desc" : "Trains operate between Jamaica Center (Parsons/Archer),
Queens, and World Trade Center, Manhattan, at all times.",
"route_type" : 1,
"route_url" : "http://www.mta.info/nyct/service/pdf/tecur.pdf"
}
> db.routes.find({"route_long_name": /Local$/},
{"route_short_name": 1, "route_long_name": 1})
{ "_id" : ObjectId("4c5f755608c3693f59580f7f"), "route_short_name" : 1,
"route_long_name" : "Broadway - 7 Avenue Local" }
{ "_id" : ObjectId("4c5f755608c3693f59580f84"), "route_short_name" : 6,
"route_long_name" : "Lexington Avenue Local" }
{ "_id" : ObjectId("4c5f755608c3693f59580f86"), "route_short_name" : 7,
"route_long_name" : "Flushing Local" }
{ "_id" : ObjectId("4c5f755608c3693f59580f8a"), "route_short_name" : "C",
"route_long_name" : "8 Avenue Local" }
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 10 / 60
22. Introduction A Taste of MongoDB
The basics of Querying IV
"D",
"E",
"F",
"G",
"J",
/*... */
]
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 12 / 60
23. Introduction A Taste of MongoDB
Query Operators I
MongoDB is no mere Key-Value store. There are myriad powerful
operators to enhance your MongoDB queries. . .
Conditional Operators: $gt (>), $lt (<), $gte (>=), $lte (<=)
Negative Equality: $ne (!=)
Array Operators: $in (SQL “IN” clause. . . takes an array), $nin
(Opposite of “IN”), $all (Requires all values in the array match),
$size (Match the size of an array)
Field Defined: $exists (boolean argument)(Great in a schemaless
world)
Regular Expressions (Language dependent - most drivers support
it)
Pass Arbitrary Javascript with $where (No OR statements, so use
WHERE for complex range filters)
Negate any operator with $not
Using a query operator requires nested objects. . .
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 13 / 60
25. Introduction A Taste of MongoDB
Query Operators III
No syntactic sugar in Java to make it easier. . .
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 15 / 60
26. Introduction A Taste of MongoDB
Insert/Update/Save I
Objects in MongoDB Collections have an “_id” field, which must
be unique.
Three ways to add/update data in MongoDB. . .
insert() always attempts to add a new row. If “_id” is present
and contains a value already in the collection, insert fails.
save() inserts if there is no “_id” field, otherwise it tries to update
the document with the specified “_id”.
update() takes a query and the new values to save. By default it
updates only the first document matching the query.
For update() you can specify two booleans whose default is false:
upsert, which indicates you wish to create a new document if the
query doesn’t match, and multi, which allows updating all
documents who match the query.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 16 / 60
28. Introduction A Taste of MongoDB
Geospatial Support I
MongoDB supports Geospatial indexing and distance based
queries
I loaded all of the NYC Subway data (in Google Transit format)
into MongoDB
Quick python code to index the “Stops” data.
connection = Connection()
db = connection[’nyct_subway’]
print "Indexing the Stops Data."
for row in db.stops.find():
row[’stop_geo’] = {’lat’: row[’stop_lat’], ’lon’: row[’stop_lon’]}
db.stops.save(row)
db.stops.ensure_index([(’stop_geo’, pymongo.GEO2D)])
“stop_geo” field is now Geospatially indexed for each stop.
How hard is it to find the 5 closest subway stops to Meetup HQ?
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 18 / 60
29. Introduction A Taste of MongoDB
Geospatial Support I
db.stops.find( { stop_geo: { $near: [40.726021, -73.99617] } }, {’stop_name’:
1}).limit(5);
{ "_id" : ObjectId("4c5f755608c3693f59580e9b"), "stop_name" : "BROADWAY-LAFAYETTE
" }
{ "_id" : ObjectId("4c5f755608c3693f59580e29"), "stop_name" : "BLEECKER
STREET-LEXINGTON" }
{ "_id" : ObjectId("4c5f755608c3693f59580f50"), "stop_name" : "PRINCE STREET
" }
{ "_id" : ObjectId("4c5f755608c3693f59580e2a"), "stop_name" : "SPRING
STREET-LEXINGTON" }
{ "_id" : ObjectId("4c5f755608c3693f59580f4f"), "stop_name" : "8TH STREET (NYU)
" }
Further commands exist to define a rectangle or circle radius for
the search.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 19 / 60
30. Introduction A Taste of MongoDB
Finally, Data Scalability.
Traditional master-slave replication
Replica Sets (new in 1.6)
Replaces master-slave setup with 1-7 server clusters
Automatic failover and recovery
AutoSharding (new in 1.6)
Horizontal scaling - partition your collections & data across as many
nodes as necessary.
Multiple nodes can service the same shard, allowing for balancing
& failover.
Map/Reduce runs across multiple shards, allowing concurrency.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 20 / 60
31. Introduction MongoDB + Scala Drivers
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 21 / 60
32. Introduction MongoDB + Scala Drivers
Using Scala with the official Java Driver I
JVM Object are JVM Objects. . .
import com.mongodb._
val conn = new Mongo()
val db = conn.getDB("test")
val coll = db.getCollection("testData")
val pies = new BasicDBList()
pies.add("cherry")
pies.add("blueberry")
pies.add("apple")
pies.add("rhubarb")
pies.add("3.14")
val doc = new BasicDBObject()
doc.put("foo", "bar")
doc.put("spam", "eggs")
doc.put("up", "down")
doc.put("pie", pies)
coll.insert(doc)
. . . Not terribly “Scala-ey”.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 22 / 60
33. Introduction MongoDB + Scala Drivers
Using Scala with the official Java Driver II
The Java driver works, but doesn’t fit well in Scala.
You need to convert your Scala objects to Java Objects, and get
nothing but Java Objects out.
Gets messy quickly.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 23 / 60
34. Introduction MongoDB + Scala Drivers
The Scala Community Adapted. . . I
Compare the previous with various Scala drivers.
mongo-scala-driver wraps & enhances the Java driver:
import com.mongodb._
import com.osinka.mongodb._
val conn = new Mongo()
val db = conn.getDB("test")
val coll = db.getCollection("testData").asScala
coll << Map(
"foo" -> "bar",
"spam" -> "eggs",
"up" -> "down",
"pie" -> List(
"cherry",
"blueberry",
"apple",
"rhubarb",
"3.14"
)
)
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 24 / 60
35. Introduction MongoDB + Scala Drivers
The Scala Community Adapted. . . II
.. Much better, although I was confused initially. Has a
object<->MongoDB mapping layer.
lift-mongodb has more than one way to do it. . . here’s just a taste:
import com.mongodb._
import net.liftweb.mongodb._
import net.liftweb.json._
import net.liftweb.json.JsonAST.JObject
import net.liftweb.json.JsonDSL._
implicit val formats = DefaultFormats.lossless
MongoDB.defineDb(DefaultMongoIdentifier,
MongoAddress(MongoHost("localhost", 27017)), "test")
val json = JsonParser.parse("""
{ "foo": "bar",
"spam": "eggs",
"up": "down",
"pie": [
"cherry",
"blueberry",
"apple",
"rhubarb",
"3.14"
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 25 / 60
36. Introduction MongoDB + Scala Drivers
The Scala Community Adapted. . . III
]
}
""").asInstanceOf[JObject]
MongoDB.useCollection("testData")( coll => {
coll.save(JObjectParser.parse(json))
})
. . . Lift’s JS & JSON tools make it very flexible, as we’ll see later.
Also has an ActiveRecord style Object<->MongoDB Mapping
layer.
Casbah reflects my own attempt at creating a sane interface
between Scala & MongoDB. Influenced by pymongo:
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 26 / 60
37. Introduction MongoDB + Scala Drivers
The Scala Community Adapted. . . IV
import com.novus.casbah.mongodb.Imports._
val coll = MongoConnection()("test")("testData")
val builder = MongoDBObject.newBuilder
builder += "foo" -> "bar"
builder += "spam" -> "eggs"
builder += "up" -> "down"
builder += "pie" -> List("cherry", "blueberry",
"apple", "rhubarb", "3.14")
coll += builder.result
. . . The syntax is still growing but is meant to match Scala syntax
sanely. Object<->MongoDB Mapping coming soon.
We’re going to cover several tools, although I know Casbah best.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 27 / 60
38. Scala + MongoDB == Win mongo-scala-driver
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 28 / 60
39. Scala + MongoDB == Win mongo-scala-driver
At its core mongo-scala-driver provides a few improvements
over the Java driver via wrappers.
Converting the Java objects to Scala requires explicit conversions,
converts DBCollection to DBObjectCollection.
DBObjectCollection implements Iterable, and provides
several operators . . .
« maps to “insert”
«? “insert”s, and checks for errors.
+= maps to “save”
-= maps to “remove”
Map objects can be used in place of DBObject (as previously
shown) due to implicit conversions.
Object mapping implemented via “Shapes”; provides Query
syntax.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 29 / 60
40. Scala + MongoDB == Win mongo-scala-driver
mongo-scala-driver: Shapes for Object Mapping I
“Shapes” uses Scala code to define Object models.
Flexible, but syntactically verbose.
Object representing “stops” on the NY Subway. . .
// Base representation
class SubwayStop extends MongoObject {
var id: Int = _
var name: String = _
var locationType: Option[Int] = None
var latitude: Double = _
var longitude: Double = _
override def toString: String =
"NYC Subway Stop at %s [Lat: %d, Lon: %d]".
format(name, latitude, longitude)
}
// Factory object
object SubwayStop extends MongoObjectShape[SubwayStop] {
lazy val id = Field.scalar("stop_id", _.id,
(x: SubwayStop, v: Int) => x.id = v)
lazy val name = Field.scalar("stop_name", _.name,
(x: SubwayStop, v: String) => x.name = v)
lazy val locationType = Field.optional(
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 30 / 60
41. Scala + MongoDB == Win mongo-scala-driver
mongo-scala-driver: Shapes for Object Mapping II
"location_type", _.locationType,
(x: SubwayStop, v: Option[Int]) =>
x.locationType = v)
lazy val latitude = Field.scalar("stop_lat", _.id,
(x: SubwayStop, v: Double) => x.latitude = v)
lazy val longitude = Field.scalar("stop_lon", _.id,
(x: SubwayStop, v: Double) => x.longitude = v)
// per docs, you must define * with all fields or (de)serialization won’t work.
override lazy val * = id :: name :: locationType ::
latitude :: longitude :: Nil
override def factory(dbo: DBObject) = Some(new SubwayStop)
}
// retrieving items
val conn = new Mongo()
val db = conn.getDB("nyct_subway")
val coll = db.getCollection("stops")
val stopsColl = coll of SubwayStop
/* stopsColl is a ShapedCollection[SubwayStop] */
SubwayStop where {
SubwayStop.latitude < 40.6,
SubwayStop.longitude >= -73.8} sortBy SubwayStop.name descending
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 31 / 60
42. Scala + MongoDB == Win lift-mongo
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 32 / 60
43. Scala + MongoDB == Win lift-mongo
lift-mongo I
Formerly “scamongo”, integrated with Lift as of 2.0
Base code provides session wrappers to MongoDB, still utilizes
Java driver’s DBObject code.
MongoDB.defineDb(DefaultMongoIdentifier,
MongoAddress(MongoHost("localhost", 27017)), "test")
MongoDB.useCollection(collectionName) ( coll => {
val doc = new BasicDBObject
doc.put("name", "MongoDB")
doc.put("type", "database")
doc.put("count", 1)
// save the doc to the db
coll.save(doc)
})
// Alternately, do everything in a single thread...
MongoDB.useSession ( db => {
val coll = db.getCollection("testCollection")
val doc = new BasicDBObject
doc.put("name", "MongoSession")
doc.put("type", "db")
doc.put("count", 1)
coll.save(doc)
})
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 33 / 60
44. Scala + MongoDB == Win lift-mongo
lift-mongo II
“lift-mongo-record” provides object mapping.
No native query syntax, but Foursquare is working on open
sourcing something they use internally.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 34 / 60
45. Scala + MongoDB == Win lift-mongo
lift-mongo-record & querying I
Object definitions are fairly straightforward. . .
class MainDoc extends MongoRecord[MainDoc] with MongoId[MainDoc] {
def meta = MainDoc
object name extends StringField(this, 12)
object cnt extends IntField(this)
object refdoc extends DBRefField[MainDoc, RefDoc](this, RefDoc)
object refdocId extends ObjectIdField(this) {
def fetch = RefDoc.find(value)
}
}
object MainDoc extends MainDoc with MongoMetaRecord[MainDoc] {
def createRecord = new MainDoc
}
class RefDoc extends MongoRecord[RefDoc] with MongoId[RefDoc] {
def meta = RefDoc
}
object RefDoc extends RefDoc with MongoMetaRecord[RefDoc] {
def createRecord = new RefDoc
}
// Querying appears limited to constructing Mongo DBObjects
val mdq1 = MainDoc.findAll(("name" -> "md1"))
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 35 / 60
46. Scala + MongoDB == Win lift-mongo
lift-mongo-record & querying II
Foursquare’s query library allow for a saner way to query data. . .
// FSMongoRecord extends "MongoRecord" to add a few methods
class Venue extends FSMongoRecord[Venue] {
def meta = Venue
object venuename extends FSStringField(this, 255)
object keywords extends StringField(this, 255)
object userid extends LongField(this)
object closed extends BooleanField(this) with AuditableField[Venue]
object mayor extends LegacyForeignKey(this, User) {
override def optional_? = true
}
object mayor_count extends OptionalIntField(this)
object aliases extends MongoListField[Venue, String](this)
object popularity extends MongoListField[Venue, Int](this)
object popularityUpdated extends OptionalJodaDateTimeField[Venue](this)
object tags extends MongoListField[Venue, String](this)
object categories extends MongoForeignObjectIdList(this, Category)
}
object Venue extends Venue with FSMetaRecord[Venue] {
override def collectionName = "venues"
def createRecord = new Venue
override def mongoIdentifier = NamedMongoIdentifier.venue
}
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 36 / 60
47. Scala + MongoDB == Win lift-mongo
lift-mongo-record & querying III
// Foursquare’s query engine allows for fluid queries in code
Venue where (_.venuename is "Starbucks")
Venue where (_.venuename nin ("Starbucks", "Whole Foods"))
Venue where (_.geolatlng near (40.72, -73.99))
Thank you to @jliszka for sharing this!
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 37 / 60
48. Scala + MongoDB == Win casbah
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 38 / 60
49. Scala + MongoDB == Win casbah
Shameless Self Promotion
Why Casbah?
Background in pymongo + MongoKit
Java driver too. . . “Java-ey”
Didn’t quite “get” scamongo and mongo-scala-driver early on
scamongo’s base didn’t fix most of my issues w/ the Java Driver
(just helped connection management)
scamongo’s ORM libraries were dependent on Lift (now
scamongo is defunct and has become lift-mongo)
mongo-scala-driver’s shapes, etc were very confusing to me as a
newbie w/o much functional background
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 39 / 60
50. Scala + MongoDB == Win casbah
Casbah is Born
Borrowed bits I liked/understood from other places and built
something that felt comfortable to me
Early on, very pythonic
Query DSL, grown from wanting a feel close to the “metal” based
on generic MongoDB knowledge
Heavily influenced in structure by @jorgeortiz85’s libraries
Quickly grew as I used more and more MongoDB with Scala;
features have been grown organically from my own needs.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 40 / 60
51. Scala + MongoDB == Win casbah
Interacting with DBObjects I
DBObject is far too structurally Java.
Sought to make them more usable & readable from Scala
Most recently - match Scala 2.8 collection Factory/Builders
Implicit conversions of Product (base for Tuple), Map. Explicit
method asDBObject for corner cases.
‘Pimped’ version of DBObject via MongoDBObject - lets
DBObject implement Scala’s Map trait.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 41 / 60
54. Scala + MongoDB == Win casbah
Interacting with DBObjects IV
// Also responds to the ’Map’ methods...
built += "x" -> "y"
built.getOrElse("x", throw new Error("Can’t find value for X"))
/* res15: AnyRef = y */
DBCollection behaves as a Scala Iterable, but interaction is
mostly the same (with addition of methods like +=).
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 44 / 60
55. Scala + MongoDB == Win casbah
Fluid Query Syntax I
My thought: Instead of keeping track of Yet Another API,
MongoDB’s Query Objects should “just work”.
Two kinds of Query Operators - ‘Bareword’ and ‘Core’.
Bareword Operators can be started as ‘bare’ statements:
val setMulti = $set ("foo" -> 5, "bar" -> "N", "spam" -> "eggs")
/* setMulti: DBObject = { "$set" : { "foo" : 5 , "bar" : "N" , "spam" : "eggs"}} */
val pushAll = $pushAll ("foo" -> (5, 10, 15, 20, 25, 38, 12, "bar", "spam", 86,
"eggs", "omg", 412, "ponies"))
/* pushAll: DBObject = { "$pushAll" : { "foo" : [ 5 , 10 , 15 , 20 , 25 , 38 , 12 ,
"bar" , "spam" , 86 , "eggs" , "omg" , 412 , "ponies"]}} */
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 45 / 60
56. Scala + MongoDB == Win casbah
Fluid Query Syntax II
Core Operators need to be anchored to the right of a DBObject
or a String (typically representing a field name):
// Find any documents where "foo" is between 5 and 15
val findFoo: DBObject = "foo" $gte 5 $lte 15
/* findFoo: DBObject = { "foo" : { "$gte" : 5 , "$lte" : 15}} */
// Find any documents where "bar" contains 1, 8 or 12
val findIn: DBObject = "foo" $in (1, 8, 12)
/* findIn: DBObject = { "foo" : { "$in" : [ 1 , 8 , 12]}} */
Just a small taste - all MongoDB Query Objects are supported
(For 1.4.x syntax - 1.6.x ($or, etc. soon))
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 46 / 60
57. Scala + MongoDB == Win casbah
Other Features I
Custom converter implementations which allow most Scala types
to be serialized cleanly to MongoDB. (Joda time
serialization/deserialization support).
Improved GridFS Functionality (loan pattern, support for
scala.io.Source)
Wrapper objects for Map/Reduce system (Help parse results to
warn of errors, etc)
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 47 / 60
58. Scala + MongoDB == Win casbah
Coming Soon I
Max Afonov @max4f working on annotation driven object mapping.
Investigating ActiveRecord implementation, with fluid query syntax
support.
Support for MongoDB 1.6.x features.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 48 / 60
59. Scala + MongoDB == Win STM + MongoDB via Akka
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 49 / 60
60. Scala + MongoDB == Win STM + MongoDB via Akka
STM + MongoDB via Akka I
Akka has an implementation of STM inspired by Clojure’s; allows
datastructures such as Maps and Vectors to become
transactional.
Akka STM supports persistence to several backends including
MongoDB.
Allows you to setup relatively simple, code managed concurrent
transactions with state stored safely in MongoDB.
Supports JTA; not yet distributed (Dependent on Multiverse, which
is working on distributed STM)
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 50 / 60
61. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 51 / 60
62. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Helping Java + Scala Interact
Implicits, “Pimp My Library” and various conversion helper tools
simplify the work of interacting with Java.
Scala and Java have their own completely different collection
libraries.
Some builtins ship with Scala to make this easier.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 52 / 60
63. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Helping Java + Scala Interact
Implicits, “Pimp My Library” and various conversion helper tools
simplify the work of interacting with Java.
Scala and Java have their own completely different collection
libraries.
Some builtins ship with Scala to make this easier.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 52 / 60
64. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Helping Java + Scala Interact
Implicits, “Pimp My Library” and various conversion helper tools
simplify the work of interacting with Java.
Scala and Java have their own completely different collection
libraries.
Some builtins ship with Scala to make this easier.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 52 / 60
65. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.7.x
Scala 2.7.x shipped with scala.collection.jcl.
scala.collection.jcl.Conversions contained some
implicit converters, but only to and from the wrapper versions - no
support for “real” Scala collections.
Neglected useful base interfaces like Iterator and Iterable
@jorgeortiz85 provided scala-javautils, which used “Pimp
My Library” to do a better job.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 53 / 60
66. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.7.x
Scala 2.7.x shipped with scala.collection.jcl.
scala.collection.jcl.Conversions contained some
implicit converters, but only to and from the wrapper versions - no
support for “real” Scala collections.
Neglected useful base interfaces like Iterator and Iterable
@jorgeortiz85 provided scala-javautils, which used “Pimp
My Library” to do a better job.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 53 / 60
67. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.7.x
Scala 2.7.x shipped with scala.collection.jcl.
scala.collection.jcl.Conversions contained some
implicit converters, but only to and from the wrapper versions - no
support for “real” Scala collections.
Neglected useful base interfaces like Iterator and Iterable
@jorgeortiz85 provided scala-javautils, which used “Pimp
My Library” to do a better job.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 53 / 60
68. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.8.x
Scala 2.8.x improves the interop game significantly.
JCL is gone - focus has shifted to proper interoperability w/ built-in
types.
scala.collection.jcl.Conversions replaced by
scala.collection.JavaConversions - provides implicit
conversions to & from Scala & Java Collections.
Includes support for the things missing in 2.7 (Iterable,
Iterator, etc.)
Great for places where the compiler can guess what you want
(implicits); falls short in some cases (like BSON Encoding, as we
found in Casbah)
@jorgeortiz85 has updated scala-javautils for 2.8 with
scalaj-collection
Explicit asJava / asScala methods for conversions. Adds
foreach method to Java collections.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 54 / 60
69. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.8.x
Scala 2.8.x improves the interop game significantly.
JCL is gone - focus has shifted to proper interoperability w/ built-in
types.
scala.collection.jcl.Conversions replaced by
scala.collection.JavaConversions - provides implicit
conversions to & from Scala & Java Collections.
Includes support for the things missing in 2.7 (Iterable,
Iterator, etc.)
Great for places where the compiler can guess what you want
(implicits); falls short in some cases (like BSON Encoding, as we
found in Casbah)
@jorgeortiz85 has updated scala-javautils for 2.8 with
scalaj-collection
Explicit asJava / asScala methods for conversions. Adds
foreach method to Java collections.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 54 / 60
70. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.8.x
Scala 2.8.x improves the interop game significantly.
JCL is gone - focus has shifted to proper interoperability w/ built-in
types.
scala.collection.jcl.Conversions replaced by
scala.collection.JavaConversions - provides implicit
conversions to & from Scala & Java Collections.
Includes support for the things missing in 2.7 (Iterable,
Iterator, etc.)
Great for places where the compiler can guess what you want
(implicits); falls short in some cases (like BSON Encoding, as we
found in Casbah)
@jorgeortiz85 has updated scala-javautils for 2.8 with
scalaj-collection
Explicit asJava / asScala methods for conversions. Adds
foreach method to Java collections.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 54 / 60
71. Interlude: Helping Scala + Java play nice together. Java <-> Scala Basics
Interoperability in Scala 2.8.x
Scala 2.8.x improves the interop game significantly.
JCL is gone - focus has shifted to proper interoperability w/ built-in
types.
scala.collection.jcl.Conversions replaced by
scala.collection.JavaConversions - provides implicit
conversions to & from Scala & Java Collections.
Includes support for the things missing in 2.7 (Iterable,
Iterator, etc.)
Great for places where the compiler can guess what you want
(implicits); falls short in some cases (like BSON Encoding, as we
found in Casbah)
@jorgeortiz85 has updated scala-javautils for 2.8 with
scalaj-collection
Explicit asJava / asScala methods for conversions. Adds
foreach method to Java collections.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 54 / 60
72. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
Outline
1 Introduction
What is MongoDB?
A Taste of MongoDB
MongoDB + Scala Drivers
2 Scala + MongoDB == Win
mongo-scala-driver
lift-mongo
casbah
STM + MongoDB via Akka
3 Interlude: Helping Scala + Java play nice together.
Java <-> Scala Basics
Implicits and Pimp Hats
4 Closing
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 55 / 60
73. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Arguments
‘Explicit’ arguments indicates a method argument you pass, well
explicitly.
‘Implicit’ indicates a method argument which is. . . implied. (But you
can pass them explicitly too.)
Implicit arguments are passed in Scala as an additional argument
list:
import com.mongodb._
import org.bson.types.ObjectId
def query(id: ObjectId)(implicit coll: DBCollection) = coll.findOne(id)
val conn = new Mongo()
val db = conn.getDB("test")
implicit val coll = db.getCollection("testData")
// coll is passed implicitly
query(new ObjectId())
// or we can override the argument
query(new ObjectId())(db.getCollection("testDataExplicit"))
How does this differ from default arguments?
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 56 / 60
74. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Arguments
‘Explicit’ arguments indicates a method argument you pass, well
explicitly.
‘Implicit’ indicates a method argument which is. . . implied. (But you
can pass them explicitly too.)
Implicit arguments are passed in Scala as an additional argument
list:
import com.mongodb._
import org.bson.types.ObjectId
def query(id: ObjectId)(implicit coll: DBCollection) = coll.findOne(id)
val conn = new Mongo()
val db = conn.getDB("test")
implicit val coll = db.getCollection("testData")
// coll is passed implicitly
query(new ObjectId())
// or we can override the argument
query(new ObjectId())(db.getCollection("testDataExplicit"))
How does this differ from default arguments?
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 56 / 60
75. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Methods/Conversions
If you try passing a type to a Scala method argument which doesn’t
match. . .
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212") // won’t compile
A fast and loose example, but simple. Fails to compile.
But with implicit methods, we can provide a conversion path. . .
implicit def strToNum(x: String) = x.toInt
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212")
In a dynamic language, this may be called “monkey patching”.
Unlike Perl, Python, etc. Scala resolves implicits at compile time.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 57 / 60
76. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Methods/Conversions
If you try passing a type to a Scala method argument which doesn’t
match. . .
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212") // won’t compile
A fast and loose example, but simple. Fails to compile.
But with implicit methods, we can provide a conversion path. . .
implicit def strToNum(x: String) = x.toInt
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212")
In a dynamic language, this may be called “monkey patching”.
Unlike Perl, Python, etc. Scala resolves implicits at compile time.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 57 / 60
77. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Methods/Conversions
If you try passing a type to a Scala method argument which doesn’t
match. . .
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212") // won’t compile
A fast and loose example, but simple. Fails to compile.
But with implicit methods, we can provide a conversion path. . .
implicit def strToNum(x: String) = x.toInt
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212")
In a dynamic language, this may be called “monkey patching”.
Unlike Perl, Python, etc. Scala resolves implicits at compile time.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 57 / 60
78. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
So WTF is an ‘Implicit’, anyway?
Implicit Methods/Conversions
If you try passing a type to a Scala method argument which doesn’t
match. . .
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212") // won’t compile
A fast and loose example, but simple. Fails to compile.
But with implicit methods, we can provide a conversion path. . .
implicit def strToNum(x: String) = x.toInt
def printNumber(x: Int) = println(x)
printNumber(5)
printNumber("212")
In a dynamic language, this may be called “monkey patching”.
Unlike Perl, Python, etc. Scala resolves implicits at compile time.
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts - 8/8/10 57 / 60
79. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
Pimp My Library
Coined by Martin Odersky in a 2006 Blog post. Similar to C#
extension methods, Ruby modules.
Uses implicit conversions to tack on new methods at runtime.
Either return a new “Rich_” or anonymous class. . .
import com.mongodb.gridfs.{GridFSInputFile => MongoGridFSInputFile}
class GridFSInputFile protected[mongodb](override val underlying:
MongoGridFSInputFile) extends GridFSFile {
def filename_=(name: String) = underlying.setFilename(name)
def contentType_=(cT: String) = underlying.setContentType(cT)
}
object PimpMyMongo {
implicit def mongoConnAsScala(conn: Mongo) = new {
def asScala = new MongoConnection(conn)
}
implicit def enrichGridFSInput(in: MongoGridFSInputFile) =
new GridFSInputFile(in)
}
import PimpMyMongo._
A note: with regards to type boundaries, [A <: SomeType]
won’t allow implicitly converted values. You can whitelist -them by / 60
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts 8/8/10 58
80. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
Pimp My Library
Coined by Martin Odersky in a 2006 Blog post. Similar to C#
extension methods, Ruby modules.
Uses implicit conversions to tack on new methods at runtime.
Either return a new “Rich_” or anonymous class. . .
import com.mongodb.gridfs.{GridFSInputFile => MongoGridFSInputFile}
class GridFSInputFile protected[mongodb](override val underlying:
MongoGridFSInputFile) extends GridFSFile {
def filename_=(name: String) = underlying.setFilename(name)
def contentType_=(cT: String) = underlying.setContentType(cT)
}
object PimpMyMongo {
implicit def mongoConnAsScala(conn: Mongo) = new {
def asScala = new MongoConnection(conn)
}
implicit def enrichGridFSInput(in: MongoGridFSInputFile) =
new GridFSInputFile(in)
}
import PimpMyMongo._
A note: with regards to type boundaries, [A <: SomeType]
won’t allow implicitly converted values. You can whitelist -them by / 60
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts 8/8/10 58
81. Interlude: Helping Scala + Java play nice together. Implicits and Pimp Hats
Pimp My Library
Coined by Martin Odersky in a 2006 Blog post. Similar to C#
extension methods, Ruby modules.
Uses implicit conversions to tack on new methods at runtime.
Either return a new “Rich_” or anonymous class. . .
import com.mongodb.gridfs.{GridFSInputFile => MongoGridFSInputFile}
class GridFSInputFile protected[mongodb](override val underlying:
MongoGridFSInputFile) extends GridFSFile {
def filename_=(name: String) = underlying.setFilename(name)
def contentType_=(cT: String) = underlying.setContentType(cT)
}
object PimpMyMongo {
implicit def mongoConnAsScala(conn: Mongo) = new {
def asScala = new MongoConnection(conn)
}
implicit def enrichGridFSInput(in: MongoGridFSInputFile) =
new GridFSInputFile(in)
}
import PimpMyMongo._
A note: with regards to type boundaries, [A <: SomeType]
won’t allow implicitly converted values. You can whitelist -them by / 60
B.W. McAdams (Novus Partners) Integrating Scala + MongoDB NY Scala Enthusiasts 8/8/10 58