以我用的Ubuntu 14.04为例    
1.  安装MongoDB     
apt-get install  mongodb     
2. 创建MongoDB的数据库目录     
mkdir -p /data/db     
3. 查看MongoDB运行状态     
mongod     
发现有个错误 ERROR: Insufficient free space for journal files     
按照这里设置以后我们就能访问mongod     
4. 访问mongod     
mongo     
    
在官方下载安装包安装完毕后,我们需要在C盘建立db目录    
C:\data\db     
然后在安装目录中运行 mongod 即可     
    
1. mongo    
MongoDB的客户端,是一个JavaScript Shell     
     
2. mongoimport     
数据导入工具,JSON,CSV,TSV     
     
3. mongoexport  
数据导出工具JSON,CSV     
     
4. mongodump     
二进制导出 (备份)     
     
5. mongorestore     
恢复一个二进制导出     
     
5. bsondump     
把导出的二进制文件转为JSON     
     
6.mongostat     
显示MongoDB 服务器当前状态概览     
     
7. BSON  
JSON的二进制形式,支持了JSON没有的数据类型     
http://bsonspec.org     
8. Mongo DB 驱动     
https://docs.mongodb.org/ecosystem/drivers/
1. 创建数据库    
在MongoDB中,使用use 命令,如果没有这个数据库,那么MongoDB会自动‘创建’     
    
2. 显示目前存在的数据    
db.links.count()  
    
3. 插入文档     
只要给JSON格式的文档即可(其中links是表名)     
db.links.insert({ title: "BI HELL", url: "http://bihell.com", comment:"great blog", tags:["tutorials", "dev"], saved_on: new Date()});     
    
4. 创建另外一个文档     
> var doc = {};    
> doc.title = "BI HELL";     
BI HELL     
> doc.url = ‘http://bihell.com‘     
http://bihell.com     
> doc.tags = ["BI", "SSIS"];     
[ "BI", "SSIS" ]     
> doc.saved_on = new Date     
ISODate("2015-09-15T14:45:00.112Z")     
> doc.meta ={}     
{ }     
> doc.meta.browser = "Internet Expolorer 11"     
Internet Expolorer 11     
> doc.meta.OS = "Windows 10"     
Windows 10     
> doc     
{     
     "title" : "BI HELL",     
     "url" : "http://bihell.com",     
     "tags" : [     
         "BI",     
         "SSIS"     
     ],     
     "saved_on" : ISODate("2015-09-15T14:45:00.112Z"),     
     "meta" : {     
         "browser" : "Internet Expolorer 11",     
         "OS" : "Windows 10"     
     }     
}     
> db.links.save(doc)     
> 
5. 查询数据    
> db.links.find()     
{ "_id" : ObjectId("55f82dbfbe4d5bc5bdb1c366"), "title" : "BI HELL", "url" : "http://bihell.com", "comment" : "great blog", "tags" : [  "tutorials",  "dev" ], "saved_on" : ISODate("2015-09-15T14:39:59.445Z") }     
{ "_id" : ObjectId("55f83002be4d5bc5bdb1c367"), "title" : "BI HELL", "url" : "http://bihell.com", "tags" : [  "BI",  "SSIS" ], "saved_on" : ISODate("2015-09-15T14:45:00.112Z"), "meta" : { "browser" : "Internet Expolorer 11", "OS" : "Windows 10" } }     
> 
再来一些练习    
> db.users.insert({ name: "Andrew"})     
> var a =db.users.findOne({ name: "Andrew"});     
> a     
{ "_id" : ObjectId("55f97afaf6986758f851295e"), "name" : "Andrew" }     
> a._id     
ObjectId("55f97afaf6986758f851295e")     
> db.links.insert({ title: "BIHell", url:"http://bihell.com",userId: a._id})     
> db.links.find()     
{ "_id" : ObjectId("55f97c23f6986758f8512960"), "title" : "BIHell", "url" : "http://bihell.com", "userId" : ObjectId("55f9783bf6986758f851295d") }     
> link = db.links.find()[0]     
> db.users.findOne({ _id: link.userId});     
{ "_id" : ObjectId("55f9783bf6986758f851295d"), "name" : "Andrew" }     
>     
   
之前查询中的ObjectID("_id" : ObjectId("55f82dbfbe4d5bc5bdb1c366")) 是MongoDB默认生成的. 我们可以在插入的时候指定     
> db.links.insert({ _id:3, name: "test"});     
返回查询结果的第一条记录     
>  db.links.find()[0]     
返回第一条记录的id     
> db.links.find()[0]._id     
获得记录的创建时间 (系统生成的ObjectID才有效)     
db.links.find()[3]._id.getTimestamp()     
当然也可以自己生成一个ObjectId     
> new ObjectId     
ObjectId("55f838989bf562500ae2a5fa")     
    
    
之前已经接触过一些查询,现在来点复杂的.    
下载bookmarks.js     
https://searchcode.com/codesearch/view/93349316/     
连接本机然后执行 bookmarks.js     
mongo 127.0.0.1/bookmarks bookmarks.js 
连接bookmarks数据库    
mongo bookmarks
我们查看links表.里面有一些数据    
> db.links.find()     
上面只是把所有记录一行行罗列出来,如果要好看点,直接显示成Json样式,可以这样写    
> db.users.find().forEach(printjson)     
类似select的查询,查找email为‘johndoe@gmail.com’的记录     
db.users.find({ email: ‘johndoe@gmail.com‘});     
db.users.find({ passwordHash: ‘another_password_hash‘ }).forEach(printjson);
使用findOne,只返回一条记录    
> db.links.findOne({favorites:100});     
使用findOne 只显示email=‘johndoe@gmail.com‘ 的name     
> db.users.findOne({ email: ‘johndoe@gmail.com‘}).name     
    
设置需要显示的字段,例子中是title 和 url, 其中1和ture等价     
> db.links.find({favorites:100},{title:1, url: true});
不显示tags字段    
> db.links.find({favorites:100},{ tags: 0 }).forEach(printjson);     
查询子对象    
> db.users.findOne({ ‘name.first‘:‘John‘});     
{     
     "_id" : ObjectId("55f983616ffe01d4461ef223"),     
     "name" : {     
         "first" : "John",     
         "last" : "Doe"     
     },     
     "age" : 30,     
     "email" : "johndoe@gmail.com",     
     "passwordHash" : "some_password_hash",     
     "logins" : [     
         {     
             "at" : ISODate("2012-04-03T21:06:07Z"),     
             "minutes" : 20     
         },     
         {     
             "at" : ISODate("2012-04-15T08:17:18Z"),     
             "minutes" : 18     
         },     
         {     
             "at" : ISODate("2012-04-30T18:03:04Z"),     
             "minutes" : 34     
         }     
     ]     
}     
只显示name子对象中的last    
> db.users.findOne({ ‘name.first‘:‘John‘},{‘name.last‘: 1});     
{     
     "_id" : ObjectId("55f983616ffe01d4461ef223"),     
     "name" : {     
         "last" : "Doe"     
     }     
}     
操作符
找到favorites 大于50的记录并且只返回title 和favorites 列    
> db.links.find({ favorites: { $gt:50}},{title:1, favorites:1,_id:0});
小于 $lt    
> db.links.find({ favorites: { $lt:150}},{title:1, favorites:1,_id:0});     
    
小于等于$lte     
> db.links.find({ favorites: { $lte:150}},{title:1, favorites:1,_id:0});     
大于等于$gte    
> db.links.find({ favorites: { $gte:150}},{title:1, favorites:1,_id:0});
大于100小于300    
> db.links.find({ favorites: { $gt:100, $lt:300}},{title:1, favorites:1,_id:0});
不等于    
> db.links.find({ tags: { $ne: ‘code‘}},{ title:1,tags:1});
in    
> db.users.find({‘name.first‘:{$in:[‘John‘,‘Jane‘]}},{‘name.first‘:1});     
> db.links.find({ tags: { $in: [‘marketplace‘,‘code‘]}},{ title: 1,tags:1,_id:0})     
   
$all 匹配所有结果     
> db.links.find({ tags: {$all:[‘marketplace‘,‘code‘]}},{title:1,tags:1,_id:0})     
or    
> db.users.find({ $or:[{‘name.first‘:"John"},{‘name.last‘:"Wilson"}]},{name:1});     
not or 找到‘name.first‘不为John 或者 ‘name.last‘ 不为 Wilson的记录    
> db.users.find({$nor:[{‘name.first‘:"John"},{‘name.last‘:"Wilson"}]},{name:1});     
    
and     
> db.users.insert({name:{first:"John",last:"Jones"}});     
> db.users.find({$and: [{‘name.first‘:"John"},{"name.last":"Jones"}]});     
exist    
> db.users.find({email:{$exists:true}},{name:1,_id:0});     
    
not exist     
> db.users.find({email:{$exists:false}},{name:1,_id:0});     
取余 mod, 查找favorites 除5余0的记录    
> db.links.find({favorites:{$mod:[5,0]}},{title:1,favorites:1,_id:0})     
找到favorites除5不余0的记录    
> db.links.find({favorites:{$not: {$mod:[5,0]}}},{title:1,favorites:1,_id:0})     
    
查找logins字段里面 minutes=20的记录    
> db.users.find({logins: {$elemMatch: { minutes:20}}});     
查找logins字段中 at  <2012-03-30的记录,(注意日期与MongoDB日期有差异的)    
> db.users.find({logins: {$elemMatch: { at: { $lt: new Date(2012,03,14)}}}}).forEach(printjson);
使用$where (即使用js ,尽量少用,效率低)    
db.users.find({$where:‘this.name.first==="John"‘})     
db.users.find({$where:‘this.name.first==="John"‘,age:30})     
如果只是用where ,你可以省略掉 $where     
db.users.find(‘this.name.first==="John"‘)     
使用函数     
> var f = function(){ return this.name.first === "John"};     
> db.users.find(f);     
> db.users.find({$where: f});     
去重    
> db.links.distinct(‘favorites‘);     
分组聚合    
关于分组具体的解说可以看这里     
> db.links.group({     
... key: { userId: true},     
... initial: {favCount:0},     
... reduce: function (doc,o) { o.favCount += doc.favorites},     
... finalize: function (o) { o.name = db.users.findOne({ _id: o.userId}).name ; } } );     
正则    
> db.links.find({ title: /tuts\+$/});     
> db.links.find({ title: /tuts\+$/},{title: 1 } );     
> db.links.find({ title: { $regex: /tuts\+$/}},{title: 1 } );     
> db.links.find({ title: { $regex: /tuts\+$/, $ne: "Mobiletuts+"}},{title: 1 } );
计数    
db.users.find({‘name.first‘: ‘John‘}).count();     
db.users.count({ ‘name.first‘: ‘John‘});     
db.users.count();
排序    
sort里面 1为正序 -1为反序     
db.links.find({},{title:1, _id:0}).sort({title:1});  
> db.links.find({},{title:1,favorites :1 ,_id:0}).sort({ favorites : -1,title:1});     
限定返回记录的数量    
> db.links.find({},{title:1, favourites:1,_id:0}).sort({ favorites : -1 }).limit(1);     
> db.links.find().limit(2).forEach(printjson);
分页    
> db.links.find({},{title:1, _id:0}).skip(0*3).limit(3);     
> db.links.find({},{title:1, _id:0}).skip(1*3).limit(3);     
> db.links.find({},{title:1, _id:0}).skip(2*3).limit(3);     
更新    
找到name.first=John的记录,然后把job的值更新为developer     
> db.users.update({‘name.first‘:‘John‘},{job:‘developer‘});     
注意:只会更新匹配到的第一条记录,第四个参数设为ture就可以更新所有记录      
> db.users.update({‘name.first‘:‘Jane‘},{$set:{job:"developer"}},false,true);     
第三个参数设为ture的时候,如果找不到第一个参数的匹配记录,则直接插入参数2作为新纪录    
> db.users.update({ name: "Kate Wills"},{ name:"Kate Wills",job:"LISP Developer"},true);     
> db.users.find({ name:"Kate Wills"});
更新某值    
> var n = {title:"Nettuts+"};     
> db.links.find(n , {title: 1, favorites :1});     
> db.links.update(n,{$inc: { favorites :5}});  --原值加5     
> db.links.find(n , {title: 1, favorites :1});     
SET    
如果原先有字段则更新,没有则直接插入一个字段     
> var q = { name: "Kate Wills" };     
> db.users.find(q);     
{ "_id" : ObjectId("5602bcd248c642324487d01f"), "name" : "Kate Wills", "job" : "LISP Developer" }     
> db.users.update(q,{$set: {job:‘Web Developer‘}});     
> db.users.find(q);     
{ "_id" : ObjectId("5602bcd248c642324487d01f"), "job" : "Web Developer", "name" : "Kate Wills" }     
> db.users.update(q,{$set:{email: ‘katewills@gmail.com‘}});     
> db.users.find(q);     
{ "_id" : ObjectId("5602bcd248c642324487d01f"), "email" : "katewills@gmail.com", "job" : "Web Developer", "name" : "Kate Wills" }     
UNSET  去掉某个字段    
> db.users.update(q,{$unset:{job:"Web Developer"}});     
> db.users.find(q);     
{ "_id" : ObjectId("5602bcd248c642324487d01f"), "email" : "katewills@gmail.com", "name" : "Kate Wills" }
SAVE    
> var bob = db.users.findOne({‘name.first‘:‘Bob‘});     
添加一个新的字段     
> bob.job = "Server Admin"     
保存记录     
> db.users.save(bob)     
findAndModify    
其中 new设为true 返回更改后的值,设为false则返回更改前的值     
> db.users.findAndModify({     
... query:{name:"Kate Wills"},     
... update:{$set:{age:20}},     
... new:true});     
{     
     "_id" : ObjectId("5602bcd248c642324487d01f"),     
     "age" : 20,     
     "email" : "katewills@gmail.com",     
     "name" : "Kate Wills"     
}     
$push增加item    
db.links.update(n,{$push:{ tags: ‘blog’}});     
    
$pushAll 增加多个item     
db.links.update(n,{ $pushAll : { tags: [‘one’,’two’]}});     
与上面不同,这会下面这个会增加子项     
db.links.update(n,{$push : { tags:[‘one’ ,’two’] }});
$addToSet   如果增加的item已经存在,则不添加    
db.links.update(n,{$addToSet:{tags:’code’}});     
db.links.update(n,{$addToSet: {tags: {$each: [‘one’,’four’]}}});
$pull 移除item    
db.links.update(n,{$pull: {tags:’four’}});
移除多个item    
db.links.update(n,{$pullAll: {tags:[‘two’,’three’]}});     
db.links.update(n,{$pull:{tags:[‘one’,’two’]}});
移除第一个item或者最后一个item    
db.links.update(n,{$pop:{tags:-1}}); 
查找数组型子项需要用到$ 位置符    
db.users.update({‘logins.minutes‘: 10},{$inc:{‘logins.$.minutes‘:1}})     
db.users.update({‘logins.minutes‘: 20},{$inc:{‘logins.$.minutes‘:1}},false,true)     
db.users.update({‘logins.minutes‘: 20},{$set:{random:true }},false,true)     
db.users.update({‘logins.minutes‘: 20},{$set:{‘logins.$.location‘:‘unknown‘ }},false,true)     
    
重命名字段     
db.users.update({random:true},{$rename:{‘random‘:‘something_else‘}},false,true);     
删除users表    
> db.users.remove();     
    
删除name.first = John的记录     
> db.users.remove({ ‘name.first‘:"Bob"});     
    
删掉记录并返回     
> db.users.findAndModify({     
... query:{‘name.first‘:/B/},     
... remove:true});     
删除一个collections    
> db.other.insert({name:"Andrew"});     
> show collections     
> db.other.drop();     
删除数据库    
> use other     
> db.test.insert({});     
> show dbs     
> db  
> db.dropDatabase()     
> db --此时还能看到other数据库,不过实际上已经删除了,这个只是内存中的     
> show dbs     
注意,MongoDB一个查询只能使用一个索引
显示查询记录    
> db.links.find({title:‘Nettuts+‘ }).explain();     
    
id列默认做了索引     
> db.links.find({"_id" : ObjectId("55f983616ffe01d4461ef22b")}).explain();     
创建一个索引    
> db.links.ensureIndex({title:1});     
查找索引    
> db.system.indexes.find()     
    
一些建立索引的参数     
dropDups  表示如果有重复值,只记录第一条     
> db.links.ensureIndex({title:1},{unique:true, dropDups:true});     
sparse 如果文档中没有title字段则不包含在索引中     
> db.links.ensureIndex({title:1},{unique:true, dropDups:true});     
> db.links.ensureIndex({title:1},{sparse:true});     
组合索引    
> db.links.ensureIndex({title:1,url:1});     
删除索引    
> db.system.indexes.find()     
> db.links.dropIndex("title_1")
1. MongoDB官方站点    
www.mongodb.org     
2. 10genEducation  MongoDB开发的领导者,同事提供培训     
education.10gen.com     
3.几本书     
MongoDB The Definitive Guide     
MongoDB IN ACTION     
MongoDB Developers
原文:http://www.cnblogs.com/haseo/p/learning_mongodb.html