Using MongoDB in Powershell
Readers of this blog know that I’ve been using MongoDB for a while, and I’ve recently become very excited about Powershell. Well recently I’ve been able to combine the two together for pure dynamically typed, schema-less, non-relational awesomeness. Such awesomeness is begging to be shared.
To get started you will need version 1.1 of the official 10gen CSharp driver for Mongodb. At the time of this writing 1.1 has not been released, so your going to have to pull the latest version from github and compile it yourself. The minimal revision of the trunk you will need is this one. First download and install the MSI (or download the source, build the MSI and install it). Then open up your favorite text editor or Powershell IDE. Personally I am a fan of Powershell ISE or plain old vim, with some configuration modifications. Now we will load the bson and driver DLLs via the Add-Type cmdlet.
# Check to see if we are running the 64 bit version of Powershell. # See http://stackoverflow.com/questions/2897569/visual-studio-deployment-project-error-when-writing-to-registry if ([intptr]::size -eq 8) { $mongoDriverPath = (Get-ItemProperty "HKLM:SOFTWAREWow6432NodeMicrosoft.NETFrameworkv3.5AssemblyFoldersExMongoDB CSharpDriver 1.0").'(default)'; } else { $mongoDriverPath = (Get-ItemProperty "HKLM:SOFTWAREMicrosoft.NETFrameworkv3.5AssemblyFoldersExMongoDB CSharpDriver 1.0").'(default)'; } Add-Type -Path "$($mongoDriverPath)MongoDB.Bson.dll"; Add-Type -Path "$($mongoDriverPath)MongoDB.Driver.dll"; |
Since the Csharp Driver MSI is 32 bits, it creates the registry entries in the Wow6432Node. Therefore, we have to check to see if we are running in the 32 or 64 bit version of Powershell . Credit to an anonymous commenter on the msgoodies blog for providing this size of a pointer trick to determine if you are running a 32 or 64 bit system.
The next thing we want to do is to create a BSON document. This is surprisingly easy.
[MongoDB.Bson.BsonDocument] $doc = @{ "_id"= [MongoDB.Bson.ObjectId]::GenerateNewId(); "FirstName"= "Justin"; "LastName"= "Dearing"; "PhoneNumbers"= [MongoDB.Bson.BsonDocument] @{ 'Home'= '718-555-1212'; 'Mobile'= '646-555-1212'; }; }; |
As you can see Powershell can convert a HashTable to a BsonDocument. This is because of the public constructor BsonDocument(IDictionary hashTable). Powershell can use these one parameter constructors to cast an object. You can use the same Hashtable trick for the QueryDocument and UpdateDocument classes.
Now that we have our BsonDocument, its time to perform basic crud operations.
$db = [MongoDB.Driver.MongoDatabase]::Create('mongodb://localhost/powershell'); $collection = $db['example1']; Write-Host "Insert"; $collection.Insert($doc); $collection.FindOneById($doc['_id']); $updates = @{'$set' = @{'email'= 'justin@mongodb.org'}}; $query = @{"_id"= $doc['_id']} Write-Host "Update"; $collection.Update([MongoDB.Driver.QueryDocument]$query, [MongoDb.Driver.UpdateDocument]$updates); $collection.FindOneById($doc['_id']); Write-Host "Delete"; $collection.Remove([MongoDB.Driver.QueryDocument]$query); $collection.FindOneById($doc['_id']); |
This gives us the output below.
_id 4dc5e5a43b42bd41d0154679
LastName Dearing
PhoneNumbers {Mobile=646-555-1212, Home=718-555-1212}
FirstName Justin
Delete
PS E:srcgistgist-854911> powershell.exe -file .MongoTest.ps1
Insert
Name Value
---- -----
_id 4dc636c33b42bd3d7c8dc3a4
LastName Dearing
PhoneNumbers {Mobile=646-555-1212, Home=718-555-1212}
FirstName Justin
Update
FirstName Justin
LastName Dearing
PhoneNumbers {Mobile=646-555-1212, Home=718-555-1212}
_id 4dc636c33b42bd3d7c8dc3a4
email justin@mongodb.org
Delete
As you can see, its not very hard to use the 10Gen MongoDB Csharp driver from within Powershell. Using Powershell with the MongoDb C-Sharp driver has many possibilities. First of all, adhoc mongodb queries from inside of powershell. Secondly,  The code for this example is available in its entirety here.
May 29th, 2011 - 08:10
I get this error:
PS C:UsersMatt> $collection.Insert($doc);Cannot find an overload for “Insert” and the argument count: “1″.At line:1 char:19+ $collection.Insert <<< ($collection | gm | ? { $_.Name -eq “Insert” } ).definition
MongoDB.Driver.SafeModeResult Insert[TDocument](TDocument document), MongoDB.Driver.SafeModeResult Insert[TDocument](TDocument document, MongoDB.Driver.SafeMode safeMode)
this is $doc:
PS C:UsersMatt> $docName                             Value—-                             —–_id                             4de1fb3d4985a212a8be2dd1LastName                           DearingPhoneNumbers                         {Mobile=646-555-1212, Home=718-555-1212}FirstName                          JustinPS C:UsersMatt> $doc.GetType()IsPublic IsSerial Name                   BaseType——– ——– —-                   ——–True   True   BsonDocument               MongoDB.Bson.BsonValue
May 29th, 2011 - 11:22
Like I stated at the beginning of the article, version 1.1 of the driver has not been released. You will have to compile the driver and MSI yourself to get that code to work now., If you can’t build the setup project because you only have Visual Studio Express or SharpDevelop, you can change the top of the script to load the dll from a static path.
May 29th, 2011 - 11:29
Sorry dude I clicked the link and didn’t look back.. :@amonkeysden:disqusÂ
good news I can still try it out myself Â
June 1st, 2011 - 22:45
 Thanks for sharing the process of Using MongoDB in Powershell.i was looking for it since a long time.