数据类型 : null bool 数值 字符串 日期 正则 数组 文档 对象id 二进制 代码

show dbs;        // 查看所有库 

show tables;     // 查看库中所有表 

db.stats();      // 查看库的大小等信息 

db.coll.stats(); // 查看表的大小等信息




对集合的操作 :

db.coll.insert({"name" : "abc"}) 

db.coll.insert([{"name" : "abc"}, {"name" : "def"}, {"name" : "lll"}, {"name" : "kkk"}]) 

db.coll.remove({}) 

db.coll.remove({"name" : "def"}) 

db.coll.update({"_id" : 1}, {"name" : "456"}) 

db.coll.update({"_id" : 1}, {"$inc" : {"count" : 1}})                  // 每次增加1 

db.coll.update({"_id" : 1}, {"$set" : {"nnnn" : "lllll"}})             // 修改或新增 

db.coll.update({"name" : "abc"}, {"$set" : {"sex" : 0}}, true, true)   // 没有就创建 多个文档操作 

db.coll.save({"_id" : 1,"name" : "abc", "sex" : 3})                    // 没有就插入 有就修改(根据_id) 

db.runCommand({"findAndModify" : "coll", "query" : {"name" : "abc"}, "sort" : {"sex" : -1}, "update" : {"$inc" : {"count" : 3}}, "new" : true, "fields" : {"sex" : 1, "count" : 1}}) 

数组 : 

// 增加数组 

db.coll.update({"name" : "lhh"},  

 {"$push" : {"mmmm" : { 

 "$each" : [{"count" : 1}, {"count" : 2}, {"count" : 3}, {"count" : 8}, {"count" : 4}, {"count" : 2}, {"count" : 9}, {"count" : 13}],  

 "$slice" : -5,  

 "$sort" : {"count" : -1}}}}) 

db.coll.update({"_id" : 1}, {"$pop" : {"contents" : {"key" : 1}}}) // 从后往前删 

db.coll.update({"_id" : 1}, {"$pull" : {"contents" : 1}})          // 删除制定元素 

db.coll.update({"contents.con" : "77885"}, {"$set" : {"contents.$.con" : "hello worlddddd"}}) // 修改数组中的某个元素 

查询 : 

db.coll.find({}, {"name" : 1, "age" : 1, "_id" : 0}) 

db.coll.find({"age" : {"$gte" : 16, "$lte" : 30}}) 

date = new Date("2017-01-02") 

date = new Date() 

db.coll.find({"date" : {"$lt" : date}}) 

db.coll.find({"name" : {"$ne" : "ggg"}})                  // 不等于 

db.coll.find({"age" : {"$in" : [18, 19, 20]}}) 

db.coll.find({"$or" : [{"name" : "hhh"}, {"age" : 21}]}) 

db.coll.find({"age" : {"$mod" : [5, 1]}})                 // 查询age对5取模为1的数据 

db.coll.find({"age" : {"$not" : {"$mod" : [5, 1]}}})      // 查询age对5取模不为1的数据 

db.coll.find({"name" : {"$eq" : "hhh"}})                  // 等于 

db.coll.find({"$and" : [{"age" : {"$gt" : 18}}, {"name" : {"$ne" : "jjj"}}]}) 

db.coll.find({"name" : {"$eq" : null, "$exists" : true}}) 

正则 : 

db.coll.find({"name" : /HH?/i}) // i代表不区分大小写 

db.coll.find({"name" : /hh?/}) 

db.coll.find({"name" : /hh/}) 

数组 : 

db.coll.find({"cont" : "name"}) 

db.coll.find({"cont" : ["name", "auth", "body"]}) 

用$in对单个和数组都会匹配 : 

db.coll.find({"cont" : {"$in" : ["name"]}}) 

db.coll.find({"cont" : {"$in" : ["name", "auth", "body"]}}) 

db.coll.find({"cont" : {"$in" : ["name", "auth"]}}) 

所以查询数组的多个匹配用$all : 

db.coll.find({"cont" : {"$all" : ["name", "auth"]}}) 

db.coll.find({"cont" : {"$size" : 3}})                            // 根据数组长度查询 

db.coll.find({"name" : "hhh"}, {"cont" : {"$slice" : 2}})         // 返回数组前两个元素 

db.coll.find({"name" : "hhh"}, {"cont" : {"$slice" : -2}})        // 返回数组后两个元素 

db.coll.find({"name" : "hhh"}, {"cont" : {"$slice" : [1, 2]}})    // 从第二个开始返回前两个元素 

db.coll.find({"cont.2" : "auth"})                                 // 数组第三个元素精确匹配 

db.coll.find({"cont.name" : "hello"}, {"cont.$" : 1})             // 查询任意一个匹配的数组 

db.coll.find({"num" : {"$elemMatch" : {"$gt" : 18, "$lt" : 50}}}) // 查询有满足条件元素的数组,如果有整个数组都会返回 

db.coll.find({"num" : {"$gt" : 10, "$lt" : 20}}).min({"num" : 10}).max({"num" : 20}) // 为了避免查询出不匹配的数组,但是num必须有索引才行,适用于有数组的查询 

内嵌文档 : 

db.coll.find({"art.auth" : "joe", "art.num" : {"$gt" : 20, "$lt" : 51}}) 

db.coll.find({"cont" : {"$elemMatch" : {"art.num" : 39, "art.auth" : "kiki"}}}) 

$where : 速度慢 

db.coll.find({"$where" : function() {for(var current in this) { for(var other in this) { if(current != this && this[current] == this[other]){}return true;}} return false; }}) 

db.coll.find({"$where" : function() { if(this.name == "hhh") return true; return false;}})


服务器端脚本执行时为防止注入用作用域
数据库使用游标返回find的执行结果,游标相当于C语言中的指针,调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样在查询之前可以给查询附加额外的选项。

cursor = db.coll.find() 

while(cursor.hasNext()) { print(cursor.next()); } 

cursor.forEach(function(x) { print(x.name) });


附加查询 :

db.coll.find().limit(3).skip(1).sort({"name" : 1}) // skip量过大时会导致查询速度变慢


高级查询 :

db.coll.find()._addSpecial("$maxscan", 3) // 本次查询扫描文档数量的上限 

$min : 查询的开始条件 

$max : 查询的结束条件 

db.coll.find()._addSpecial("$showDiskLoc",true) // 显示该条结果在磁盘上的位置




将文档修改后再保存回去,如果结果集比较大,会多次返回同一个文档,因为游标从开头开始不断向右移动,但是文档由于体积增大会发生移动,这样游标可能多次移动过同一个游标。
 
游标的生命周期 : 在服务器端,游标消耗内存和其他资源
游标终止条件 : 
1. 遍历尽结果
2. 客户端发来消息要求终止
3. 在一定时间内没有使用
4. 客户端的游标已经不在作用域,驱动器程序会向服务器发送销毁游标的消息


数据库命令 :

db.runCommand() : 例 : 

 db.runCommand({"getLastError" : 1}) 

 db.runCommand({"drop" : "test"}) 

 db.adminCommand() : 在非admin数据库中执行管理员命令  

 db.adminCommand({"shutdown" : 1})


原理 :

db.$cmd.findOne({"drop" : "test"}) // 通过查询$cmd集合做一些特殊处理