数据类型 : 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集合做一些特殊处理