mongo学习笔记

mongo链接URI编写规则:http://www.mongodb.org/display/DOCS/Connections

通过分片实现横向扩展
MONGO淘汰了主从复制,改成了复制集
通过副本集实现高可用,通过分片实现高并发

可以不用提前定义表的结构
每条记录可以有不同的列,相同列的值的类型可以不同
_id可以赋值,如不赋值,则自动生成唯一值
_id是所有集合中文档必须的
文档是行,集合是表
可以在内嵌文档上创建索引

地址空间索引:可以统计从给定坐标开始的特定距离内有多少个元素

mongo只在必须的时候写入磁盘,频率大概是100毫秒
GridFS是mongo存储二进制数据的解决方案,BJSON中存储的二进制最多是16MB

 

show tables 和show collections 都可以

apt-get install python-pip
pip install pymongo==x.y.z

常用数据类型:
string
int(32和64)
double
数组
object(json)
时间戳
date
二进制

索引的两个缺点:占空间、降低插入删除速度

db.lianjia.getIndexes();
db.lianjia.insert({});
db.lianjia.insert([{},{}]);
db.lianjia.find({},{_id:0,title:1})
查询内嵌文档
db.lianjia.find({“tracklist.title":"in boom"})
下面这种匹配不到内容,因为精准匹配到tracklist
db.lianjia.find({“tracklist“:{title":"in boom"}})
查询包含aaa的数组
db.lianjia.find({”auth":"aaa"})

db.linajia.find({dtime:{"$gte":1990,"$lt":2001}})
db.lianjia.find({”auth":{"$ne":"aaa"}})

$in $nin 后面接一组可能匹配的值
db.lianjia.find("name":{"$in":[11,22]})
匹配列举的所有的值
db.lianjia.find({tag:{$all:["storage", "not used"]})
limit限制返回条数,当赋值0,则返回所有条目
db.lianjie.find().sort({title:-1}).limit(10).skip(11)

固定集合:1、大小固定 2、顺序与插入顺序一致

计算个数 db.lianjia.find().limit(10).count();
db.lianjia.find().limit(10).count(true);
或操作 db.linajia.find({"$or":{"name":11,"age":22}})


$mod只能用于整数


唯一值:db.lianjia.distinct("name")
db.lianjia.distinct("student.age")

在分配系统中不能使用group,要使用mapreduce

过滤奇偶 db.lianjia.find({age:{$mod:[2,0]}}) #只能作用于整数
#过滤数组大小 db.lianjia.find({list:{$size:2}})
不能用$size搜索数组大小范围
过滤字段存在db.lianjia.find({age:{'$exits':true}})
按字段类型过滤db.lianjia.find({age:{$type:3}})

匹配完整的数组:
db.lianjia.find({tracklist:{$elemMatch:{title:"sdf","track":1}}})
取反:
db.lianjia.find({tracklist:{$not:{$elemMatch:{title:"sdf","track":1}}})
+++++
{ "_id" : ObjectId("62660ab4578d1d404c036e15"), "name" : "class1", "student" : [ { "name" : "aa", "age" : 11 }, { "name" : "bb", "age" : 22 } ] }
{ "_id" : ObjectId("62660ac9578d1d404c036e16"), "name" : "class2", "student" : [ { "name" : "cc", "age" : 11 }, { "name" : "dd", "age" : 22 } ] }

db.tst.find({"student":{"age":11,"name":"cc"}}); #没有返回值
db.tst.find({"student":{"$elemMatch":{"age":11,"name":"cc"}}}); #返回了62660ac9578d1d404c036e16对应的记录
db.tst.find({"student.age":11,"student.name":"cc"}); #返回了62660ac9578d1d404c036e16对应的记录

db.tst.find({"student.age":11,"student.name":"dd"}); #返回了62660ac9578d1d404c036e16对应的记录
db.tst.find({"student":{"$elemMatch":{"age":11,"name":"dd"}}}); #没有返回值
++++++
若查询的正则表达式不是前缀表达式,则不能有效的使用索引

有则改,无则插入:db.lianjia.updateone({name:zzz},{$set:{age:15}},{upsert:true})
updatemany
更新某个字段,$set $inc
db.dalian.updadteone({name:11},{$inc:4})
删除字段$unset

向数组中添加1个值
db.lianjia.updateone({},{$push:{author:zcy}})
向数组中添加多个值
db.lianjia.updateone({},{$push:{author:{$each:[11,22,33]}})

从数组中删除元素: 负数则删除第一个,整数则删除最后一个
db.lianjia.updateone({},{$pop:{author:1}})
删除指定元素:pull pullall
db.linajia.updateone({},{$pullall:{title:[11,22]}})

可以通过findAndModify实现对文档的原子操作
批量写入只能用于单一集合
删除文档:db.lianjia.deleteone({})
deletemany
删除集合:db.lianjia.drop()

删除正在使用的数据库:db.dropdatabase()

创建索引:db.lianjia.createindex({title:1}) #1是升序,-1是降序

强制使用指定的索引查询即可:db.lianjia.find().hint({name:-1})

返回查询计划: db.lianjia.find().explian()

db.tmall.aggregate([{$match: {"dtime" : {"$gt":ISODate("2020-09-16T00:00:00Z"),"$lt":ISODate("2020-09-23T00:00:00Z")}}},
{$group: { _id: {dtime:"$dtime",cat_name:"$cat_name",title:"$title"}}},
{$project:{_id:0,"cat_name":"$_id.cat_name","title":"$_id.title","dtime":"$_id.dtime"}},{$out:"group_tmall"}],{allowDiskUse:true})


db.lianjia.aggregation([{$group:{_id:{dtime:$dtime},count:{$sum:1}}])
group里还可以加first,last ,max,min

$group $limit $match $sort $unwind $project $skip $out $redact $lookup

[
{$match:{num: {$gt:5}}},
{$group:{_id:{dtime:$dtime,cat_name:$cat_name}},count:{$sum:1}},
{$unwind:$vegetables},
{$project:{_id:0, fruits:1}},
{$sort: {dtime:1}},
{$limit:1},
{$out:"group_tmall"}
]

左外连接:lookup
[
{$lookup:{from:aaa,localfield:num,foreignfield:num,as:newkey}}
]
}

{"name":"class2","student":[{"name":"cc","age":11},{"name":"dd","age":22}]}

posted on 2022-04-25 11:09  我和你并没有不同  阅读(34)  评论(0编辑  收藏  举报