mongodb基本操作,CRUD
假设当前有库test,且其中的集合也为test
1、登录mongodb客户端
mongo -uroot -p --authenticationDatabase "admin"
2、查看数据库
show dbs
3、切换/新建数据库(如果库不存在,mongodb会自动创建,但需要库中存在集合,在show dbs的时候才会显示)
use 数据库名称
4、查看当前数据库中集合
show collections
5、插入数据,insertOne只会插入一个文旦个,如果存在多个文档,除第一个外,其他的被舍弃
db.test.insertOne({"key":"val"})
6、插入
db.test.insert({"key":"val","key2":"val2"})
7、插入多条数据
db.test.insertMany([{"key":"val","key2":"val2",...},{"k":"v",...},...])
8、insert方法既可以插入单条数据也可以插入多条数据,插入多条数据时,一定要添加上最外层中括号,否则只会保存第一条数据
db.test.insert([{"key":"val",key2:val2},{"key3":"val3",key4:val4}])
9、根据条件删除数据(如果存在多个符合条件的数据,则也只是删除第一条符合条件数据)
db.test.deleteOne({"key":"val","key2":"val2",...}) db.test.deleteOne({"key":{$eq:"val"},"key2":{$eq:"val2"},...})
类似eq的操作还有很多
https://docs.mongodb.com/manual/reference/operator/query/
10、根据条件删除数据(如果存在多个符合条件数据,则全部删除)
db.test.deleteMany({"key":"val","key2":"val2",...})
或者如上述deleteOne方式使用$eq
11、根据一个key多个值删除
db.test.deleteMany({"key":{$in:["val","val2",...]}})
写成以下方式不正确,最后面的值会覆盖前一个值
db.test.deleteMany({"key":"val","key":"val2"})
12、删除整个集合下文档
db.test.deleteMany({})
13、更新单个文档
db.test.updateOne({"key":"val"},{$set:{"key2":"val2","key3":"val3",...}},{upsert:true})
其中upsert可选值为true/false,当为true时,则表示过滤条件未查询出记录时,将进行插入操作,为false,则不进行插入,但也不会返回错误
或者将updateOne改为update也可以,但updateOne必须使用$set修改参数
不要使用
db.test.update({"key":"val",...},{"key2":"val2",...}),这种方式类似于插入,会将之前的数据清除掉,重新插入数据,唯一不变的是这条记录的_id.
需要谨记的是,如果不需要忽略掉没有修改的数据,一定要使用$set来修改数据。
14、批量更新文档
db.test.updateMany({"key":"val",...},{$set:{"key2":"val2",...}})
同样该操作必须带上$set,否则会提示更新失败
updateMany会更新所有符合过滤条件的记录对应的参数
15、replaceOne
16、查询全部
db.test.find()
17、条件查询
db.test.find({"key":"val","key2":"val2",...})
18、某个条件中包含所有值查询
db.test.find({"key":{$in:["val","val2",...]},...})
19、查询返回指定的列
db.test.find().projection({"key":1,"key2":1})
20、查询时去掉自带的id,在java中想去掉,直接当成普通的列去掉即可
db.test.find({},{_id:0})
21、查询分页
db.test.find().skip(pageNum*pageSize).limit(pageSize)
22、建立单个索引,升序为1,降序为-1
db.test.createIndex({"key":1})
此时将生成一个名为key_1的索引,如果为降序,则索引名称为-1,也可以自己命名索引名称
23、查询某个key对应的记录中的某个字段,其中第一个{}中为查询条件,第二个为查询的列,如果第一个{}中为空,则表明查询所有列中的第二个{}中的字段
db.test.find({"key":"val"},{"showcol1":1},"showcol2":1}).pretty()
24、多条件查询,且有一个条件中参数为字符串
// 查询第二个条件相等
db.test.find({"key":"val","key":{$eq:"val"}},{"showcol":1}).pretty()
// 查询第二个条件不等于
db.test.find({"key":"val","key":{$ne:"val"}},{"showcol":1}).pretty()
25、批量修改某个字段值,下面{"_id":item._id}必须带上,否则语法不正确,后者将_id改为其他key也行,但必须得有
db.getCollection('test').find({"key":"val"}).forEach( function(item){ db.getCollection('test').update({"_id":item._id},{$set:{"key": "val2"}}) } )
26、查询某个字段并且去重复
db.test.distinct("key")
27、查询存在某个字段的document的数量其中true也可以为1,查询不存在某个字段的document的数量,true改为false/0,如下为查询存在字段key的文档数。
db.test.find({"key":{"$exists":true}}).count()
28、清除某个字段,如下为清空当前集合中所有文档中的字段key
db.tr069_param_values.updateMany({},{"$unset":{"key":1}})