个人根据官网学习过程笔记,回头时可以很快回忆
在mongo 的shell中
show dbs
use db(还没有写入数据库)
db.collection.insert({})(插入数据,同时也会有数据了)
db.collection.insertOne({})
db.collection.insertMany([])
db.dropDatabase()删除数据库
db.collection.drop()删除集合
db.collection.find()
dd = ({item:12,item1:”wq”})
db.col.insert(dd) or db.col.save(dd) ps:同一个dd,save多次只有一个,dd重新赋值后,内容相同,也会再save一份;如果dd中有 _id,那么就是update;如果insert,可以插入多个
db.col.update({‘item’:’value’},{$set:{‘改变值得item’:’values’}},{multi:true}) ,multi:true 决定是否更新多个匹配的title,否则只更新一个,如果直接({},{}),那么符合条件的就会被覆盖
db.col.remove({query},true) true只删除一个
and: db.col.find({‘item1’:”value”,”item2”:”value2”})
or: db.col.find({“$or”:[{“item1”:”value”}, {“item2”,”value”}]})
db.col.find({“wq”:{$type:7}}) 按照wq的类型查找
db.col.find({},{“title”:1,_id:0}).limit(2) limit,只显示两条
db.col.find({},{“title”:1,_id:0}).skip(1) skip 跳过前面的1条,从第二条开始
db.COLLECTION_NAME.find().sort({KEY:1}) sort()方法可以通过参数指定排序的字段 1 升序,-1降序 注: 如果没有指定sort()方法的排序方式,默认按照文档的升序排列。
db.col.ensureIndex({KEY:1}) Key 要创建的索引字段,1升序创建索引,降序为-1。
db.col.aggregate([{group:{_id:"item1",r:{sum:1}}}]) 总和, 其他平均avg, min, max 等不会
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});只显示了title,author,id没有显示
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );匹配后分组
db.article.aggregate(
{ $skip : 5 });跳过前五
db.col.find({item:{in:[ value, value,]}})
db.col.find({“item.subitem”:{in:[ value, value,]}})
----start-----
"item":[value1,value2]
db.col.find({item:[value1,value2]})
db.col.find({item:value1}) 包含一个
db.col.find({"item.0":value1}) index的值对上
db.col.find({item:{$gt:15, $lt:17}}) 经测试,应该是有一个先满足了15,然后可以是另一个满足17
db.col.find({item:{$elemMatch:{$gt:15, $lt:17}}}) array中的某个元素满足15-17
-----end-------
db.col.find({匹配条件},{显示条件}):除了id外,其他的要么全1,表示只显示这几个,要么全0,表示除了这几个其他的都显示,不能组合排除和包含语句
db.col.find({_id:1},{name:1,item2:1, _id:0})包含
db.col.find({_id:1},{name:0,"item2.subitem":0, _id:0})排除
db.col.find({..},{item:{$slice:-1}}) item是[],-1:最后一组,2前两组数据
db.col.find({item:{$exists:false|true}}) item是否存在
更新
db.col.update({..匹配},{item:value..},{multi:true}) 相当于直接替换,或者 update({..匹配},{$set:{item:value},$currentDate:{item:true}}) 更新部分
db.col.replaceOne({..匹配},{替换的内容,json文档内容}) 和 db.col.update({},{}) 很像
{$currentDate:{item:true}} 更新item时间为当前时间
还未测试:
db.collection.findOneAndReplace().
db.collection.findOneAndUpdate().
db.collection.findAndModify().
db.collection.save().
db.collection.bulkWrite().
删除
db.col.deleteOne({..})
db.col.deleteMany({..匹配条件}) 或 deleteMany({})删除所有
db.col.remove() 和deletemany差不多 remove({..},1) 只删除一个
db.col.drop() 删除所有,更高效
查询:
ne: db.col.find({item:{$ne:2}}) item的值不等于2或者没有item这个key的
nin: {item:{$nin:[value1..]}} ne和这个效果差不多
in: {item:{$in:[value1,value2..]}} item是array或int,str单个的值,value可以为int,str等,可以用/pattern/这样形式的正则表达式,[/^be/] be开头的字符串,其他的不行, #**各自语言使用各自的正则表达式python中使用 re re.compile("^be")**
eq: 如果item是array,item:{$eq:2} 和 item:2 都是查找item包含2的, item是其他,效果和 item:value 一样
gt,gte,lt,lte
exists: {item:{$exists:boolean}}
type: {item:{$type:1}} == {item:{$type:'double'}}
{item:{$type:'number'}} 这个会返回
{item:{$mod:[4,1]}} item除以4余1的结果
$text $search: 先创建索引,db.col.createIndex({item:'text'}), db.col.find({$text:{$search:'value'}}) 搜索了value
all: {item:{$all:[value1,value2]}} item通常是数组
elemMatch: {item:{$elemMatch:{query1,query2..}}} item的数据,满足query所有的条件 {item:{$elemMatch:{subitem:value, subitem:{query}}}} 满足子条件
size: {item:{$size:2}} item必须是array,返回array个数是2的结果
$comment:注释 {item:value, $comment:''}
$: db.collection.find( { <array>: <value> ... }, { "<array>.$": 1 } )
db.collection.find( { <array.field>: <value> ...},{ "<array>.$": 1 } ) 显示满足条件的array的第一个元素
find({queryes},{item:{$elemMatch:{..}}}) 查找queryes符合的元素,返回时,关于item的内容,只返回elemMatch中匹配的元素,其他的比如 _id 都会返回
db.col.find({},{item:{$slice:5}}) 前五个, -5: 最后五个 {item:{$slice:[skip,limit]}} 跳过skip,limit个,skip为负数,则是倒着数
or: db.col.find({"$or":[{query1}, {query2}]})
and: 和or一样
not: { field: { $not: { query } } } 和query相反,包括field不存在的
nor: {$nor:[{query1},{item:100}..]} 返回与query相反的结果,多个query之间是或的关系,包括item不存在的
这些取反结果的,会取item不存在的,可以使用{item:{$exists:false}}查找item的相反结果
更新 操作符
inc: 增加值 db.col.update({..},{$inc:{item:amount1, item2:amount2..}}) amount可以为负数,
mul: 原值翻倍 db.col.update({..},{$mul:{item:number}}) item为number,number乘以item原来的值,如果item不存在,则item默认为0
rename: 改名 ({..},{$rename:{item:newitemname1,item.subitem:newitem, item1: newitem.subitem}}) 用点符号的必须是dict newitem存在则覆盖
setOnInsert: update时,在目标不存在且创建的时候触发 ({id:1},{query, $setOnInsert:{name:'wq'}},{upsert:true}) 没找到id 1 的,那么创建id1,和query,然后才执行
set: ({..},{$set:{item:value, "item.subitem":"value"}})
unset: {$unset:{item:"", item2:""}}
min,max: {$min:{item:15}} 取item原值和15的最小值为item,
或者日期比较, {$max:{date:new Date("0202-01-09")}}
currentDate: {$currentDate:{login:true,date:{$type:'timestamp'}}} 更新时,login当前时间,date当前时间戳,也可以用$type:'date'
$: ({item:1},{$set:{'item.$':111}}) 猜测:item限于array,查询时用到了item,那么在后面set时,才能使用item.$ item.s的item要在查询中调用
each: {$addToSet:{item:{$each:[1,2,3,4,5,5]}}} 给push和addToSet增加多个值用的
list: {$pop:{item:1}} 弹出一个元素,item一定是array,1:弹最后一个,最右边的, -1: 弹头一个,最左边的, 其他数字无效,看正负
pullAll: {$pullAll:{item:[2,3]}} item是array,删除item中的所有2,3 , 2,3也是放在array中的
pull: {$pull:{item:value, item2:{$gt:7}}} 单个,item2小于7的都删除 {$pull:{item:{$in:[1,2,3]}}} 数组, {$pull:{item:{subitem:1,subitem2:2}}} item是一个array,subitem是单个子项的值,是dict,那么两个sub都匹配了才pull
pushAll: {$pushAll:{item:[1,2,3,4,5,]}}
push: {$push:{item:value}} item 是array
{$push:{item:{$each[1,2,3,4], $sort:{item2:-1}, $slice:3}}} push完后,按照item2降序,保留3个
slice: update中,**slice和each一起用** {$push:{item:{$each[], $slice:3}}} 至少each也要是[],搜则报错
sort: {$push:{item:{$each:[],$sort:1}}} **update中要和each一起用**,至少也是[],1 和 -1 是排序方向, 不能使用 ‘item.subitem’: 1,,但是{$push:{item:{$each:[],$sort:{subitem:1}}}} 那么对subitem是排序了的 1是升序,-1是降序
position: **必须与 each修饰符一起出现** {$push:{item:{$each:[1,2],$position:0}}} 添加在头部 -> 1,2,3 不是 3,1,2
aggregate,统计部分暂时用不到,以后再说
project: 一些用法 db.col.aggregate([{$project:{item1:1,item2:1,_id:0}}]) 结果显示item1,item2, _id隐藏(默认显示)
游标:
var m = db.col.find({..})
打印下一个
print(tojson(m.next()))
printjson(m.next())
m.forEach(printjson)
一些暂时跳过或没明白的、其他:
MongoDB复制原理
minkey和maxkey
where 少用 db.myCollection.find( { $where: “this.credits == this.debits” } );
可以按位查询,匹配数值或二进制
mate
bit
isolated