1.插入文档:insert
语法:db.collection_name.insert({<key1>:<value1>,<key2>:<value2>...})
1.1 插入一条文档
> use fruitsdb # 数据库存在则连接,不存在,则新建;
switched to db fruitsdb
> db.fruitsInfo.insert({"name":"apple",price:10}) // 插入
WriteResult({ "nInserted" : 1 })
> db.fruitsInfo.find() // 查询集合信息
{ "_id" : ObjectId("5e45649f34694e662cebe073"), "name" : "apple", "price" : 10 }
>
(1) 此处的db为数据库名,如果在程序中往数据库插入值的话,则应该写成:fruitsdb.fruitsInfo.insert({"name":"apple",price:10})
(2) insert命令,会自动产生一个ID
(3) insert命令可以使用save命令代替。若使用save命令指定_id值,则会更新默认的_id值
> db.fruitsInfo.save({_id:9999,"name":"orange",price:8})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 9999 })
> db.fruitsInfo.find()
{ "_id" : 9999, "name" : "orange", "price" : 8 } // _id已经被自定义
1.2 插入多条文档(无序)
db.fruitsInfo.insert(
[
{
"name":"watermelon",price:3
},
{
"name":"strawberry",price:20
},
{
"name":"peach",price:8
}
]
)
注意:使用insert命令一次性插入多条文档会比一条一条的插入省时,效率较高。
1.3 插入多条文档(有序)
此处的有序是从上往下顺序执行的意思
db.fruitsInfo.insert(
[
{
_id:1,"name":"watermelon",price:3
},
{
_id:2,"name":"strawberry",price:20
},
{
_id:3,"name":"peach",price:8
}
],
{ordered:true} // true表示出错,则命令执行失败。false表示,如果其中有一条记录出错,则除了出错记录外,其他记录继续插入
)
1.4 特殊的插入:insertOne与insertMany
-- 此语句插入会报错
db.goodsInfo.insertOne(
[
{_id:120,"name":"三国演义",price:89},
{_id:121,"name":"红楼梦",price:89}
]
)
---支持多条插入
db.goodsInfo.insertMany(
[
{_id:114,"name":"三国演义",price:89},
{_id:115,"name":"红楼梦",price:89}
]
)
insertOne可以确保只插入一条文档,不允许做多文档操作。insertMany则反之。
2.查询文档:find
语法:db.collection_name.find()
2.1 简单查询:db.collection_name.find()
db.collection_name.find() # collection_name为集合名字
2.2 条件查询
# 单条件查询
db.goodsInfo.find(
{"name":"三国演义"} // 此为查询条件
)
# 查询需要的字段
db.goodsInfo.find(
{"name":"三国演义"} ,
{_id:0} //此处的0或者false表示不显示字段,1或者true表示显示字段
)
2.3 查询null或不存在的字段
// 插入
db.studentInfo.insert(
[
{
_id:110,name:"Jack"
},
{
_id:111,name:"Lucy"
},
{
_id:112,name:null
},
{
_id:113
}
]
)
// 查询
db.studentInfo.find(
{
name:null
}
)
//------------输出结果------------
{ "_id" : 112, "name" : null }
{ "_id" : 113 }
// 查找的值不存在
db.studentInfo.find(
{
name:{$exists:false}
}
)
//------------输出结果------------
{ "_id" : 113 }
2.4 limit与skip方法
db.studentInfo.find().limit(2) // 返回前2行记录
db.studentInfo.find().skip(2) // 跳过前2行,从第3行开始显示
2.5 $in运算符的查询
db.studentInfo.find(
{
_id:{
$in:[110,111] // 查找_id等于110与111的文档
}
}
)
2.6 find()查询条件操作符及实例
操作符 | 格式 | 实例 | 与TRDB的对比 |
---|---|---|---|
小于 | { |
db.studentInfo.find({age:{$lt:19}}) | where age<19 |
小于等于 | { |
db.studentInfo.find({age:{$lte:19}}) | where age<=19 |
大于 | { |
db.studentInfo.find({age:{$gt:19}}) | where age>19 |
大于等于 | { |
db.studentInfo.find({age:{$gte:19}}) | where age>=19 |
不等于 | { |
db.studentInfo.find({age:{$ne:19}}) | where age!=19 |
and | { |
db.studentInfo.find({age:18,name:"Jack"}) | where age=18 and age='Jack' |
or | {$or:[{ |
db.studentInfo.find({$or:[{_id:110},{_id:111}]}) | |
模糊匹配:匹配尾部 | { |
db.studentInfo.find({name:{$regex:/ck$/}}) | where name like '%ck' |
模糊匹配:匹配头部 | { |
db.studentInfo.find({name:{$regex:/^Ja/}}) | where name like 'Ja%' |
模糊匹配:匹配任意部分 | { |
db.studentInfo.find({name:{$regex:/Ja/}}) | where name like '%Ja%' |
2.7 区间查询
// 查询年龄大于17小于19岁的文档
db.studentInfo.find(
{
age:{$gt:17,$lt:19}
}
)
3.更新文档:update
语法:db.collection_name.update()
3.1 简单修改:$set
// 插入测试文档
db.bookInfo.insert(
{
title:"武侠小说",
total:23,
detail:[
{name:"神雕侠侣",score:9.2,hitCount:888888},
{name:"笑傲江湖",score:8.8,hitCount:999999},
{name:"碧血剑",score:8.9,hitCount:1111111}
]
}
)
// 更新title
db.bookInfo.update(
{
title:"武侠小说"
},
{
$set:{title:"好看的武侠小说"}
}
)
3.2 更新数值(加法):$inc
使用$inc更新数值,做的是加法运算。以下更新语句,更新后total的值为46
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$inc:{total:23}
}
)
3.3 更新数值(乘法):$mul
使用$mul更新数值,做的是乘法运算。以下更新语句,更新后total的值为92
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$mul:{total:2}
}
)
3.4 修改字段名:$rename
// 修改字段名,将total修改为sum
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$rename:{"total":"sum"}
}
)
3.5 根据最小值更新:$min
将$min给出的值与当前文档字段值进行比较,当给定值较小时,则修改当前文档值为给定值
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$min:{total:2}
}
)
3.6 根据最小值更新:$max
将$max给出的值与当前文档字段值进行比较,当给定值较大时,则修改当前文档值为给定值
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$max:{total:12}
}
)
3.7 删除字段:$unset
// 删除字段,删除sum字段
db.bookInfo.update(
{
title:"好看的武侠小说"
},
{
$unset:{sum:92}
}
)
3.8 修改一条文档里的数组和嵌套文档
// 插入文档数据
db.bookInfo.insert(
{
_id:100,
title:"书单1",
amount:120,
unit:"RMB",
detail:[
{name:"西游记",price:98},
{name:"三国演义",price:120}
],
overview:{shopName:"当当网",shopNum:37}
}
)
// 更新数据
db.bookInfo.update(
{
_id:100
},
{
$set:{
"detail.0":{name:"红楼梦",price:130}, // 更新detail数组的第一个元素
"overview.shopName":"京东商城" // 更新嵌套文档
}
}
)
注意:引用嵌套文档对象或数组的时候,需要加""号,如:
"detail.0"
,"overview.shopName"
3.8 多文档修改:multi
// 插入多文档
db.custInfo.insert(
[
{name:"张三",age:18,address:"China"},
{name:"李四",age:19,address:"China"},
{name:"王五",age:17,address:"China"},
{name:"Jack",age:16,address:"America"},
{name:"Tom",age:12,address:"America"}
]
)
// 更新address为China的记录,将值修改为:云南
// 不添加参数multi,只会更新一条文档
db.custInfo.update(
{address:"China"},{$set:{address:"云南"}}
)
// 添加参数multi,更新多条文档
db.custInfo.update(
{address:"China"},{$set:{address:"云南"}},{multi:true}
)
3.9 简化修改命令:updateOne(),updateMany(),replaceOne()
updateOne()
:修改一条文档,与update()的区别是少了multi:
updateMany()
:修改多条文档,与update()的区别是少了multi:
replaceOne()
:与update()的区别是有2处,一是没有multi:
// replaceOne 操作案例(谨慎使用)
db.custInfo.replaceOne(
{
name:"李四"
},
{
age:56
}
)
注意:使用replaceOne对文档进行操作的时候,如果类似上述操作,则会直接将原有文档除_id外的字段全部替换给定字段,具体案例如下图:
4.删除文档:remove
4.1 删除文档中所有记录:db.collection_name.remove()
// 插入数据
db.custInfo.insertMany(
[
{name:"Jack",age:18},
{name:"Marry",age:19}
]
)
// 删除
db.custInfo.remove({})
若要删除整个集合,可以使用
db.custInfo.drop()
删除,此方法效率更高,并且会把整个集合和索引一起删除。
4.2 删除符合条件的记录
// 插入数据
db.custInfo.insertMany(
[
{name:"Jack",age:18},
{name:"Marry",age:19}
]
)
// 删除
db.custInfo.remove({age:{$gt:18}})
如果需要删除满足条件的单条记录,则添加justOne
选项,案例如下:
// 插入数据
db.custInfo.insertMany(
[
{name:"Jack",age:18},
{name:"Marry",age:19},
{name:"Marry",age:20}
]
)
// 删除
db.custInfo.remove(
{age:{$gt:18}},
{justOne:true}
)