This blog contains the document set that will be used throughout the blog series.
Document Set Characteristics
The data set is a collection of documents, whereby each document contains three properties:
- “x”: This property contains a different data value in each document
- “comment”: this property describes “x” as originally specified. When the document is queried, it is clear what the original specification of “x” was. This is necessary as the node.js driver modifies documents on insert.
- “btype”: this property contains the BSON type designator. When the document is queried, the type is clear without having to query it explicitly.
Since the blog series is evolving, the set of documents might change as needed in order to point out more specifics; the current set is a good starting point, however.
If there is more than one way to insert a specific type, several documents are included, one document for each possibility. This is to show the possible alternatives exhaustively.
JavaScript, BSON, JSON
Node.js is is implementing server-side JavaScript (based on Google’s V8 Engine). So the data types that are passed back and forth to the MongoDB Node.js driver are JavaScript types.
MongoDB internally operates on BSON. This means that on the way from the Node.js driver to MongoDB JavaScript types are transformed into BSON (and vice versa on the way back). For some BSON types MongoDB provides constructors.
While many equate JavaScript data types structures with JSON, actually JSON is not an equivalent serialization of JavaScript types (more on that issue during the blog series).
Based on this discussion, the test data document set tries to cover all JavaScript types and their variation, plus the JavaScript implementation of BSON types. This will also clarify more over the course of the blog series.
Document Set
The following code is complete in the sense that it runs and inserts the documents into a MongoDB database called “nodeTest”, using all the defaults.
/*global require*/ var MongoDB = require('mongodb'); /* Type codes ========== 1 "\x01" e_name double Floating point 2 "\x02" e_name string UTF-8 string 3 "\x03" e_name document Embedded document 4 "\x04" e_name document Array 5 "\x05" e_name binary Binary data 7 "\x07" e_name (byte*12) ObjectId 8 "\x08" e_name "\x00" Boolean "false" 8 "\x08" e_name "\x01" Boolean "true" 9 "\x09" e_name int64 UTC datetime 10 "\x0A" e_name Null value 11 "\x0B" e_name cstring cstring Regular expression 13 "\x0D" e_name string JavaScript code 15 "\x0F" e_name code_w_s JavaScript code w/ scope 16 "\x10" e_name int32 32-bit Integer 17 "\x11" e_name int64 Timestamp 18 "\x12" e_name int64 64-bit integer 255 "\xFF" e_name Min key 127 "\x7F" e_name Max key Deprecated type codes ===================== 6 "\x06" e_name Undefined — Deprecated 12 "\x0C" e_name string (byte*12) DBPointer — Deprecated 14 "\x0E" e_name string Symbol — Deprecated */ var typeDocuments; typeDocuments = [ {"x": new MongoDB.Double(123.123), "comment": "new MongoDB.Double(123.123)", "btype": 1}, {"x": 456.456, "comment": "456.456", "btype": 1}, {"x": "abc", "comment": "abc", "btype": 2}, {"x": {"z": 5}, "comment": "{\"z\": 5}", "btype": 3}, // this is not type:4 {"x": [9, 8, 7], "comment": "[9, 8, 7]", "btype": 16}, {"x": [ {"y": 4}, {"z": 5} ], "comment": "[{\"y\": 4}, {\"z\": 5}]", "btype": 3}, {"x": new MongoDB.Binary("binary"), "comment": "new MongoDB.Binary(\"binary\")", "btype": 5}, // t:6 deprecated (was 'undefined') - not implemented {"x": new MongoDB.ObjectID("5040dc5d40b67c681d000001"), "comment": "new MongoDB.ObjectID(\"5040dc5d40b67c681d000001\")", "btype": 7}, {"x": false, "comment": "false", "btype": 8}, {"x": true, "comment": "true", "btype": 8}, {"x": new Date("2012-08-31 12:13:14:156 UTC"), "comment": "new Date(\"2012-08-31 12:13:14:156 UTC\")", "btype": 9}, {"x": null, "comment": "null", "btype": 10}, {"x": new RegExp("abc"), "comment": "new RegExp(\"abc\")", "btype": 11}, {"x": new RegExp("abc", "i"), "comment": "new RegExp(\"abc\", \"i\")", "btype": 11}, // t:12 DBRef deprecated - still implemented // this is not type:12 {"x": new MongoDB.DBRef("types_node", "5040dc5d40b67c681d000001", "types"), "comment": "new MongoDB.DBRef(\"types_node\", \"5040dc5d40b67c681d000001\", \"types\")", "btype": 3}, // this is not type:12 {"x": new MongoDB.DBRef("types_node", "5040dc5d40b67c681d000001"), "comment": "new MongoDB.DBRef(\"types_node\", \"5040dc5d40b67c681d000001\")", "btype": 3}, // MongoDB defined JSON serialization (http://docs.mongodb.org/manual/reference/mongodb-extended-json/) // this is not type:12 {"x": {"$ref": "types_node", "$id": "5040dc5d40b67c681d000001", "$db": "types"}, "comment": "{\"$ref\": \"types_node\", \"$id\": \"5040dc5d40b67c681d000001\", \"$db\": \"types\"}", "btype": 3}, // this is not type:12 {"x": {"$ref": "types_node", "$id": "5040dc5d40b67c681d000001"}, "comment": "{\"$ref\": \"types_node\", \"$id\": \"5040dc5d40b67c681d000001\"}", "btype": 3}, {"x": new MongoDB.Code("function () {}"), "comment": "new MongoDB.Code(\"function () {}\")", "btype": 13}, // t:14 Symbol deprecated - still implemented {"x": new MongoDB.Symbol("def15"), "comment": "new MongoDB.Symbol(\"def15\")", "btype": 14}, {"x": new MongoDB.Code("function (a) {}", {"a": 4}), "comment": " new MongoDB.Code(\"function (a) {}\", {\"a\": 4})", "btype": 15}, {"x": 123456, "comment": "123456", "btype": 16}, {"x": new MongoDB.Timestamp(1, 2), "comment": "new MongoDB.Timestamp(1, 2)", "btype": 17}, {"x": new MongoDB.Long("987"), "comment": "new MongoDB.Long(\"987\")", "btype": 18}, {"x": new MongoDB.MinKey(), "comment": "new MongoDB.MinKey()", "btype": 255}, {"x": new MongoDB.MaxKey(), "comment": "new MongoDB.MaxKey()", "btype": 127}, // ADDITIONAL POSSIBLE VALUES // 'undefined' will be converted to 'null'; type will be 'null' (aka 10) also {"x": undefined, "comment": "undefined", "btype": 10}, {"x": Number.NaN, "comment": "Number.NaN", "btype": 1}, {"x": Infinity, "comment": "Infinity", "btype": 1}, {"x": Number.POSITIVE_INFINITY, "comment": "Number.POSITIVE_INFINITY", "btype": 1}, {"x": Number.NEGATIVE_INFINITY, "comment": "Number.NEGATIVE_INFINITY", "btype": 1}, {"x": Number.MIN_VALUE, "comment": "MIN_VALUE", "btype": 1}, {"x": Number.MAX_VALUE, "comment": "MAX_VALUE", "btype": 1} ]; var Db = MongoDB.Db, Server = MongoDB.Server; var db = new Db('nodeTest', new Server("127.0.0.1", 27017, {auto_reconnect: false, poolSize: 4}), {native_parser: false, safe: false}); db.open(function (err, db) { "use strict"; db.dropCollection("types_node", function (err, result) { var i, printLog = function (err, result) { if (err) { console.log(err.toString()); } console.log(result); }; if (err) { console.log(err.toString()); } console.log("Drop Collection Result: " + result); db.collection("types_node", function (err, collection) { for (i = 0; i < typeDocuments.length; i = i + 1) { collection.insert(typeDocuments[i], {safe: true}, printLog); } }); }); });