Skip to content

Latest commit

 

History

History
128 lines (108 loc) · 2.76 KB

README.md

File metadata and controls

128 lines (108 loc) · 2.76 KB

MongoDbSample

This is a simple Maven project demonstrating the use of the MongoDb Java driver with the example of a bookstore containing books which have authors.

Usage

Setup MongoDb

In order to test this example (which means running the included JUnit test case), you need to setup your own MongoDb with three collections:

  • authors
  • books
  • bookstores

Authentication

To connect to your database, modify the DefaultAuth class and enter your credentials:

public final class DefaultAuth extends DbAuth {

	public DefaultAuth() {
		/** enter your credentials here */
		super("DATABASE_USERNAME", "DATABASE_PW", "DATABASE_NAME", "SERVER_IP");
	}
}

Data model

The data this sample stores into MongoDb looks similar to the following.

"bookstores" collection:

{
    "_id" : ObjectId("5835b19b4e5a9ca2509e4384"),
    "name" : "Thalia",
    "books" : [ 
        ObjectId("5835b19b4e5a9ca2509e437e"), 
        ObjectId("5835b19b4e5a9ca2509e437f"), 
        ObjectId("5835b19b4e5a9ca2509e4380")
    ]
}

"books" collection:

{
    "_id" : ObjectId("5835b19b4e5a9ca2509e437e"),
    "author" : ObjectId("5835b19a4e5a9ca2509e437c"),
    "prices" : [ 
        10.0
    ]
}
{
    "_id" : ObjectId("5835b19b4e5a9ca2509e437f"),
    "author" : ObjectId("5835b19b4e5a9ca2509e437d"),
    "prices" : [ 
        11.0
    ]
}
{
    "_id" : ObjectId("5835b19b4e5a9ca2509e4380"),
    "author" : ObjectId("5835b19a4e5a9ca2509e437c"),
    "prices" : [ 
        12.0
    ]
}

"authors" collection:

{
    "_id" : ObjectId("5835b19a4e5a9ca2509e437c"),
    "firstName" : "Dan",
    "lastName" : "Brown"
}
{
    "_id" : ObjectId("5835b19b4e5a9ca2509e437d"),
    "firstName" : "Stephen",
    "lastName" : "King"
}

Database aggregation query

In order to query a full "bookstore" form the database containing all information about "books" and "authors", the following MongoDb query is required:

db.getCollection('bookstores').aggregate(
  { "$unwind": "$books" },
  { "$lookup": {
      "from": "books",
      "localField": "books",
      "foreignField": "_id",
      "as": "books"
    }
  },
  { "$unwind": "$books" },
  { "$lookup": {
      "from": "authors",
      "localField": "books.author",
      "foreignField": "_id",
      "as": "authors"
    }
  },
  { "$unwind": "$authors" },
  { "$group": {
      "_id": "$_id",
      "name": {
        "$first": "$name"
      },
      "books": {
        "$push": {
          "_id": "$books.id",
          "author": "$authors",
          "prices": "$books.prices"
        }
      }
    }
  }
)

Query result

The result of the above query returns a document containing all information about the bookstore, the books it contains and their authors.