show dbs 显示所有库
use db_name 切换到db_name库
show collections 显示当前库的所有文档集合
db.user_table.insert({"bar":"baz"}) 插入文档,会自动生成一个objectID
db.user_table.insert([{"_id":0},{"_id":1},{"_id":2}]) 批量插入多个文档
> db.user_table.remove({"bar":"baz" } ) WriteResult({ "nRemoved" : 1 })
//条件删除,如果不加条件,默认删除里面的所有文档,但是集合本身不被删除,里面的元信息也不会被删除
drop的删除速度比remove快,但是集合和元信息也会都被删除,drop的条件删除会把所有文档都删除?
> db.user_table.drop({"name":"wgy" } ) true //执行完这个后所有数据都没了,但是集合信息还在?慎用 drop
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$set":{"favorite book":"war and peace"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$set 也可以 修改键的类型
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$set":{"favorite book":["war and peace","ender's game"]}}) //现在类型变成了array类型
$unset 用来删除一个字段
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$unset":{"favorite book":1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
还支持修改内嵌文档
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$set":{"author.name":"joe schmoe"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
增加、修改或删除键时,应该使用$修改器,如果用下面的做法就会将整个文档替换为你更新的内容
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"age":"40"}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })//会将整个文档替换成age:40
$inc 修改器用来增加已有键的值,或者该键不存在那就创建一个。对于更新分析数据、因果关系、投票或者其他有变化数值的地方 ,使用这个都会非常方便。
db.table_name.update({"url":"www.example.com"},...{"$inc":{"pageviews":1}})
将pageviews原子操作+1
如果数组已经存在,会向已有的数组末尾加入一个元素,要是没有就创建一个新数组
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$push":{"comments":{"name":"joe","email":"joe@example.com","content":"nice post."}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$push 与 $each 搭配可以一次添加多个值
> db.user_table.update({"_id":ObjectId("5bd16a9f702d5b35cc7a8adc")},{"$push":{"hourly":{"$each":[254,4513,466,456]}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
如果希望数组的最大长度是固定的,可以将$slice 与 $push组合在一起使用
对应的有$pop
其余的还有$ne, $addToSet,$定位符,
有的修改器运行比较快 ,$inc就能就地修改,因为不需要改变文档大小。 这是因为将文档插入到mongo中时,依次 插入的文档在磁盘上的位置是相邻的。因此,如果一个文档变大了,原先的位置就放不下了,就会重新开辟内存移到新开辟的内存中去。
填充因子:是mongo为每个文档预留的空间(类似于go中的cap容量)
1.最初文档之间没有多余的空间
2.当一个文档超过空间大小时,就释放掉原先的空间,开辟新的空间,填充因子就会变大
3.之后插入的文档都会拥有填充因子指定大小的增长空间,如果再之后的插入中不再发送文档移动,填充因子会逐渐变小