{
  "name": "mongodb",
  "description": "A node.js driver for MongoDB",
  "keywords": [
    "mongodb",
    "mongo",
    "driver",
    "db"
  ],
  "version": "1.3.23",
  "author": {
    "name": "Christian Amor Kvalheim",
    "email": "christkv@gmail.com"
  },
  "contributors": [
    {
      "name": "Aaron Heckmann"
    },
    {
      "name": "Christoph Pojer"
    },
    {
      "name": "Pau Ramon Revilla"
    },
    {
      "name": "Nathan White"
    },
    {
      "name": "Emmerman"
    },
    {
      "name": "Seth LaForge"
    },
    {
      "name": "Boris Filipov"
    },
    {
      "name": "Stefan Schärmeli"
    },
    {
      "name": "Tedde Lundgren"
    },
    {
      "name": "renctan"
    },
    {
      "name": "Sergey Ukustov"
    },
    {
      "name": "Ciaran Jessup"
    },
    {
      "name": "kuno"
    },
    {
      "name": "srimonti"
    },
    {
      "name": "Erik Abele"
    },
    {
      "name": "Pratik Daga"
    },
    {
      "name": "Slobodan Utvic"
    },
    {
      "name": "Kristina Chodorow"
    },
    {
      "name": "Yonathan Randolph"
    },
    {
      "name": "Brian Noguchi"
    },
    {
      "name": "Sam Epstein"
    },
    {
      "name": "James Harrison Fisher"
    },
    {
      "name": "Vladimir Dronnikov"
    },
    {
      "name": "Ben Hockey"
    },
    {
      "name": "Henrik Johansson"
    },
    {
      "name": "Simon Weare"
    },
    {
      "name": "Alex Gorbatchev"
    },
    {
      "name": "Shimon Doodkin"
    },
    {
      "name": "Kyle Mueller"
    },
    {
      "name": "Eran Hammer-Lahav"
    },
    {
      "name": "Marcin Ciszak"
    },
    {
      "name": "François de Metz"
    },
    {
      "name": "Vinay Pulim"
    },
    {
      "name": "nstielau"
    },
    {
      "name": "Adam Wiggins"
    },
    {
      "name": "entrinzikyl"
    },
    {
      "name": "Jeremy Selier"
    },
    {
      "name": "Ian Millington"
    },
    {
      "name": "Public Keating"
    },
    {
      "name": "andrewjstone"
    },
    {
      "name": "Christopher Stott"
    },
    {
      "name": "Corey Jewett"
    },
    {
      "name": "brettkiefer"
    },
    {
      "name": "Rob Holland"
    },
    {
      "name": "Senmiao Liu"
    },
    {
      "name": "heroic"
    },
    {
      "name": "gitfy"
    },
    {
      "name": "Andrew Stone"
    },
    {
      "name": "John Le Drew"
    },
    {
      "name": "Lucasfilm Singapore"
    },
    {
      "name": "Roman Shtylman"
    },
    {
      "name": "Matt Self"
    },
    {
      "name": "Gregory Langlais"
    }
  ],
  "repository": {
    "type": "git",
    "url": "http://github.com/mongodb/node-mongodb-native.git"
  },
  "bugs": {
    "url": "http://github.com/mongodb/node-mongodb-native/issues"
  },
  "dependencies": {
    "bson": "0.2.5",
    "kerberos": "0.0.3"
  },
  "devDependencies": {
    "dox": "0.4.4",
    "uglify-js": "1.2.5",
    "ejs": "0.6.1",
    "request": "2.12.0",
    "nodeunit": "0.7.4",
    "markdown": "0.3.1",
    "gleak": "0.2.3",
    "step": "0.0.5",
    "async": "0.1.22",
    "integra": "latest",
    "optimist": "latest"
  },
  "optionalDependencies": {
    "kerberos": "0.0.3"
  },
  "config": {
    "native": false
  },
  "main": "./lib/mongodb/index",
  "homepage": "http://mongodb.github.com/node-mongodb-native/",
  "directories": {
    "lib": "./lib/mongodb"
  },
  "engines": {
    "node": ">=0.6.19"
  },
  "scripts": {
    "test": "make test_functional"
  },
  "licenses": [
    {
      "type": "Apache License, Version 2.0",
      "url": "http://www.apache.org/licenses/LICENSE-2.0"
    }
  ],
  "readme": "## MongoDB Node.JS Driver\n \n| what          | where                                          |\n|---------------|------------------------------------------------|\n| documentation | http://mongodb.github.io/node-mongodb-native/  |\n| apidoc        | http://mongodb.github.io/node-mongodb-native/  |\n| source        | https://github.com/mongodb/node-mongodb-native |\n| mongodb       | http://www.mongodb.org/                        |\n\n### Bugs / Feature Requests\n\nThink you’ve found a bug? Want to see a new feature in PyMongo? Please open a\ncase in our issue management tool, JIRA:\n\n- Create an account and login <https://jira.mongodb.org>.\n- Navigate to the NODE project <https://jira.mongodb.org/browse/NODE>.\n- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it.\n\nBug reports in JIRA for all driver projects (i.e. NODE, PYTHON, CSHARP, JAVA) and the\nCore Server (i.e. SERVER) project are **public**.\n\n### Questions and Bug Reports\n\n * mailing list: https://groups.google.com/forum/#!forum/node-mongodb-native\n * jira: http://jira.mongodb.org/\n\n### Change Log\n\nhttp://jira.mongodb.org/browse/NODE\n\n## Install\n\nTo install the most recent release from npm, run:\n\n    npm install mongodb\n\nThat may give you a warning telling you that bugs['web'] should be bugs['url'], it would be safe to ignore it (this has been fixed in the development version)\n\nTo install the latest from the repository, run::\n\n    npm install path/to/node-mongodb-native\n\n## Live Examples\n<a href=\"https://runnable.com/node-mongodb-native\" target=\"_blank\"><img src=\"https://runnable.com/external/styles/assets/runnablebtn.png\" style=\"width:67px;height:25px;\"></a>\n\n## Introduction\n\nThis is a node.js driver for MongoDB. It's a port (or close to a port) of the library for ruby at http://github.com/mongodb/mongo-ruby-driver/.\n\nA simple example of inserting a document.\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;\n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n\n    var collection = db.collection('test_insert');\n    collection.insert({a:2}, function(err, docs) {\n      \n      collection.count(function(err, count) {\n        console.log(format(\"count = %s\", count));\n      });\n\n      // Locate all the entries using find\n      collection.find().toArray(function(err, results) {\n        console.dir(results);\n        // Let's close the db\n        db.close();\n      });\n    });\n  })\n```\n\n## Data types\n\nTo store and retrieve the non-JSON MongoDb primitives ([ObjectID](http://www.mongodb.org/display/DOCS/Object+IDs), Long, Binary, [Timestamp](http://www.mongodb.org/display/DOCS/Timestamp+data+type), [DBRef](http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef), Code).\n\nIn particular, every document has a unique `_id` which can be almost any type, and by default a 12-byte ObjectID is created. ObjectIDs can be represented as 24-digit hexadecimal strings, but you must convert the string back into an ObjectID before you can use it in the database. For example:\n\n```javascript\n  // Get the objectID type\n  var ObjectID = require('mongodb').ObjectID;\n\n  var idString = '4e4e1638c85e808431000003';\n  collection.findOne({_id: new ObjectID(idString)}, console.log)  // ok\n  collection.findOne({_id: idString}, console.log)  // wrong! callback gets undefined\n```\n\nHere are the constructors the non-Javascript BSON primitive types:\n\n```javascript\n  // Fetch the library\n  var mongo = require('mongodb');\n  // Create new instances of BSON types\n  new mongo.Long(numberString)\n  new mongo.ObjectID(hexString)\n  new mongo.Timestamp()  // the actual unique number is generated on insert.\n  new mongo.DBRef(collectionName, id, dbName)\n  new mongo.Binary(buffer)  // takes a string or Buffer\n  new mongo.Code(code, [context])\n  new mongo.Symbol(string)\n  new mongo.MinKey()\n  new mongo.MaxKey()\n  new mongo.Double(number)\t// Force double storage\n```\n\n### The C/C++ bson parser/serializer\n\nIf you are running a version of this library has the C/C++ parser compiled, to enable the driver to use the C/C++ bson parser pass it the option native_parser:true like below\n\n```javascript\n  // using native_parser:\n  MongoClient.connect('mongodb://127.0.0.1:27017/test'\n    , {db: {native_parser: true}}, function(err, db) {})\n```\n\nThe C++ parser uses the js objects both for serialization and deserialization.\n\n## GitHub information\n\nThe source code is available at http://github.com/mongodb/node-mongodb-native.\nYou can either clone the repository or download a tarball of the latest release.\n\nOnce you have the source you can test the driver by running\n\n    $ make test\n\nin the main directory. You will need to have a mongo instance running on localhost for the integration tests to pass.\n\n## Examples\n\nFor examples look in the examples/ directory. You can execute the examples using node.\n\n    $ cd examples\n    $ node queries.js\n\n## GridStore\n\nThe GridStore class allows for storage of binary files in mongoDB using the mongoDB defined files and chunks collection definition.\n\nFor more information have a look at [Gridstore](https://github.com/mongodb/node-mongodb-native/blob/master/docs/gridfs.md)\n\n## Replicasets\n\nFor more information about how to connect to a replicaset have a look at the extensive documentation [Documentation](http://mongodb.github.com/node-mongodb-native/)\n\n### Primary Key Factories\n\nDefining your own primary key factory allows you to generate your own series of id's\n(this could f.ex be to use something like ISBN numbers). The generated the id needs to be a 12 byte long \"string\".\n\nSimple example below\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;    \n\n  // Custom factory (need to provide a 12 byte array);\n  CustomPKFactory = function() {}\n  CustomPKFactory.prototype = new Object();\n  CustomPKFactory.createPk = function() {\n    return new ObjectID(\"aaaaaaaaaaaa\");\n  }\n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n\n    db.dropDatabase(function(err, done) {\n      \n      db.createCollection('test_custom_key', function(err, collection) {\n        \n        collection.insert({'a':1}, function(err, docs) {\n          \n          collection.find({'_id':new ObjectID(\"aaaaaaaaaaaa\")}).toArray(function(err, items) {\n            console.dir(items);\n            // Let's close the db\n            db.close();\n          });\n        });\n      });\n    });\n  });\n```\n\n## Documentation\n\nIf this document doesn't answer your questions, see the source of\n[Collection](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js)\nor [Cursor](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/cursor.js),\nor the documentation at MongoDB for query and update formats.\n\n### Find\n\nThe find method is actually a factory method to create\nCursor objects. A Cursor lazily uses the connection the first time\nyou call `nextObject`, `each`, or `toArray`.\n\nThe basic operation on a cursor is the `nextObject` method\nthat fetches the next matching document from the database. The convenience\nmethods `each` and `toArray` call `nextObject` until the cursor is exhausted.\n\nSignatures:\n\n```javascript\n  var cursor = collection.find(query, [fields], options);\n  cursor.sort(fields).limit(n).skip(m).\n\n  cursor.nextObject(function(err, doc) {});\n  cursor.each(function(err, doc) {});\n  cursor.toArray(function(err, docs) {});\n\n  cursor.rewind()  // reset the cursor to its initial state.\n```\n\nUseful chainable methods of cursor. These can optionally be options of `find` instead of method calls:\n\n  * `.limit(n).skip(m)` to control paging.\n  * `.sort(fields)` Order by the given fields. There are several equivalent syntaxes:\n  * `.sort({field1: -1, field2: 1})` descending by field1, then ascending by field2.\n  * `.sort([['field1', 'desc'], ['field2', 'asc']])` same as above\n  * `.sort([['field1', 'desc'], 'field2'])` same as above\n  * `.sort('field1')` ascending by field1\n\nOther options of `find`:\n\n* `fields` the fields to fetch (to avoid transferring the entire document)\n* `tailable` if true, makes the cursor [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors).\n* `batchSize` The number of the subset of results to request the database\nto return for every request. This should initially be greater than 1 otherwise\nthe database will automatically close the cursor. The batch size can be set to 1\nwith `batchSize(n, function(err){})` after performing the initial query to the database.\n* `hint` See [Optimization: hint](http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint).\n* `explain` turns this into an explain query. You can also call\n`explain()` on any cursor to fetch the explanation.\n* `snapshot` prevents documents that are updated while the query is active\nfrom being returned multiple times. See more\n[details about query snapshots](http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database).\n* `timeout` if false, asks MongoDb not to time out this cursor after an\ninactivity period.\n\nFor information on how to create queries, see the\n[MongoDB section on querying](http://www.mongodb.org/display/DOCS/Querying).\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;    \n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n\n    var collection = db\n      .collection('test')\n      .find({})\n      .limit(10)\n      .toArray(function(err, docs) {\n        console.dir(docs);\n    });\n  });\n```\n\n### Insert\n\nSignature:\n\n```javascript\n  collection.insert(docs, options, [callback]);\n```\n\nwhere `docs` can be a single document or an array of documents.\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n\nSee also: [MongoDB docs for insert](http://www.mongodb.org/display/DOCS/Inserting).\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;    \n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n    \n    db.collection('test').insert({hello: 'world'}, {w:1}, function(err, objects) {\n      if (err) console.warn(err.message);\n      if (err && err.message.indexOf('E11000 ') !== -1) {\n        // this _id was already inserted in the database\n      }\n    });\n  });\n```\n\nNote that there's no reason to pass a callback to the insert or update commands\nunless you use the `safe:true` option. If you don't specify `safe:true`, then\nyour callback will be called immediately.\n\n### Update: update and insert (upsert)\n\nThe update operation will update the first document that matches your query\n(or all documents that match if you use `multi:true`).\nIf `safe:true`, `upsert` is not set, and no documents match, your callback will return 0 documents updated.\n\nSee the [MongoDB docs](http://www.mongodb.org/display/DOCS/Updating) for\nthe modifier (`$inc`, `$set`, `$push`, etc.) formats.\n\nSignature:\n\n```javascript\n  collection.update(criteria, objNew, options, [callback]);\n```\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n* `multi:true` If set, all matching documents are updated, not just the first.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `update`:\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;    \n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n\n    db.collection('test').update({hi: 'here'}, {$set: {hi: 'there'}}, {w:1}, function(err) {\n      if (err) console.warn(err.message);\n      else console.log('successfully updated');\n    });\n  });\n```\n\n### Find and modify\n\n`findAndModify` is like `update`, but it also gives the updated document to\nyour callback. But there are a few key differences between findAndModify and\nupdate:\n\n  1. The signatures differ.\n  2. You can only findAndModify a single item, not multiple items.\n\nSignature:\n\n```javascript\n    collection.findAndModify(query, sort, update, options, callback)\n```\n\nThe sort parameter is used to specify which object to operate on, if more than\none document matches. It takes the same format as the cursor sort (see\nConnection.find above).\n\nSee the\n[MongoDB docs for findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command)\nfor more details.\n\nUseful options:\n\n* `remove:true` set to a true to remove the object before returning\n* `new:true` set to true if you want to return the modified object rather than the original. Ignored for remove.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `findAndModify`:\n\n```javascript\n  var MongoClient = require('mongodb').MongoClient\n    , format = require('util').format;    \n\n  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {\n    if(err) throw err;\n    db.collection('test').findAndModify({hello: 'world'}, [['_id','asc']], {$set: {hi: 'there'}}, {}, function(err, object) {\n      if (err) console.warn(err.message);\n      else console.dir(object);  // undefined if no matching object exists.\n    });\n  });\n```\n\n### Save\n\nThe `save` method is a shorthand for upsert if the document contains an\n`_id`, or an insert if there is no `_id`.\n\n## Release Notes\n\nSee HISTORY\n\n## Credits\n\n1. [10gen](http://github.com/mongodb/mongo-ruby-driver/)\n2. [Google Closure Library](http://code.google.com/closure/library/)\n3. [Jonas Raoni Soares Silva](http://jsfromhell.com/classes/binary-parser)\n\n## Contributors\n\nAaron Heckmann, Christoph Pojer, Pau Ramon Revilla, Nathan White, Emmerman, Seth LaForge, Boris Filipov, Stefan Schärmeli, Tedde Lundgren, renctan, Sergey Ukustov, Ciaran Jessup, kuno, srimonti, Erik Abele, Pratik Daga, Slobodan Utvic, Kristina Chodorow, Yonathan Randolph, Brian Noguchi, Sam Epstein, James Harrison Fisher, Vladimir Dronnikov, Ben Hockey, Henrik Johansson, Simon Weare, Alex Gorbatchev, Shimon Doodkin, Kyle Mueller, Eran Hammer-Lahav, Marcin Ciszak, François de Metz, Vinay Pulim, nstielau, Adam Wiggins, entrinzikyl, Jeremy Selier, Ian Millington, Public Keating, andrewjstone, Christopher Stott, Corey Jewett, brettkiefer, Rob Holland, Senmiao Liu, heroic, gitfy\n\n## License\n\n Copyright 2009 - 2013 MongoDb Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n",
  "readmeFilename": "Readme.md",
  "_id": "mongodb@1.3.23",
  "_from": "mongodb@~1.3.19"
}
