在命令里面加了注释,以便更好的阅读
插入文档
通过Mongo往MongoDB指定集合里插入文档,在TRDB里相当于往表里插入记录,但是MongoDB不需要预先对数据存储结构进行定义,用插入命令往数据库文件里写入数据的同时就自动建立相关内容。
语法:db.collection.insert()
在集合里插入一条或者多条文档,db为数据库名,默认为当前数据库。collection为集合名,insert为插入文档命令。
-
插入一条简单文档
> use goodsdb switched to db goodsdb > db.goodsbaseinf.insert( //在集合goodsbaseinf里面插入了一条数据 {name:"MongoDB教程",price:32} ) WriteResult({ "nInserted" : 1 }) > db.goodsbaseinf.find() //显示集合内容,后续会说到 { "_id" : ObjectId("5f6c45c04950ca21722fb49b"), "name" : "MongoDB教程", "price" : 32 }
当我们使用insert没定义id时,会自动给我们生成一个_id值
插入其实有两种写法:
-
db.conllection.insert()
若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
-
db.conllection.save()
如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceMany() 来代替。
当然我们也可以用变量方式来插入文档。
>document = ({name:"MongoDB教程",price:32}) >db.goodsbaseinf.insert(document)
-
-
插入一条复杂的文档
> db.goodsbaseinf.insert( { name:"MongoDB零基础教学", bookprice:11.2, adddate:2020-09-24, allow:true, baseinf:{ ISBN:11245124544,press:"成理工程出版社" }, tags:["good","book","it","Program"] } )
insert里面可以嵌套文档,这样可以避免TRDB里的多表关联(join)运算。
-
插入多条有序文档
db.goodsbaseinf.remove({}) //删除一个集合中的所有数据 db.goodsbaseinf.insert( { _id:13,item:"大学生教材", name:"《大学英语》",price:32 } ) db.goodsbaseinf.insert( [ { _id:13,item:"大学生教材", name:"《高等数学上册》",price:32 }, { _id:15,item:"大学生教材", name:"《高等数学下册》",price:33 }, { _id:14,item:"大学生教材", name:"《大学物理》",price:34 } ], { ordered:true } )
现在我们goodsbaseinf这个集合里面有"_id:13"的文档记录,那么执行上面的多条插入会失败,在ordered:true的情况下,不能和已有的id冲突,如果有则全部失败;ordered:fasle的情况下,除了出错记录以外的数据都能够插入。
-
简化的插入命令
-
db.collection.insertOne()
>document = ({name:"MongoDB教程",price:32}) >db.goodsbaseinf.insertOne(document) { "acknowledged" : true, "insertedId" : ObjectId("5f6c536a74d392978dcd0d1f") } // 该命令保证程序员插入的是一条文档,不能插入多条文档
-
db.collection.insertMany()
>db.goodsbaseinf.remove({}) >documents = ([{ _id:13,item:"大学生教材", name:"《高等数学上册》",price:32 }, { _id:15,item:"大学生教材", name:"《高等数学下册》",price:33 }, { _id:14,item:"大学生教材", name:"《大学物理》",price:34 }]) >db.goodsbaseinf.insertMany(documents) { "acknowledged" : true, "insertedIds" : [ 13, 15, 14 ] }
-
查询文档
MongoDB 查询文档使用 find() 方法。
find() 方法以非结构化的方式来显示所有文档
db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
-
查询指定集合所有文档
db.goodsbaseinf.find()//不美观 db.goodsbaseinf.find().pretty()//美观
-
等价查询条件
> db.goodsbaseinf.find( { name:"《大学物理》", price:34 }, { name:1,price:1,_id:0 } ) { "name" : "《大学物理》", "price" : 34 }
公共查询条件:{< key1 >:< value1 >,< key2 >,< value2 >…},相当于SQL里面的and语法。
如果不显示id值,就需要在后面指定,1或者true表示显示,0或者false表示不显示。
-
嵌套查询
db.goodsbaseinf.find( { "baseinf.press":"成理工程出版社" } )
使用这个查询之前,需要用到插入一条复杂的文档的例句,因为在中间过程中,删除了前面的数据,下面的也是如此
-
数据查询
db.goodsbaseinf.find( { tags:["good","book","it","Program"] } )//等价查询某一数组 db.goodsbaseinf.find( { tags:"good" } )//查询数组里的某一个值 db.goodsbaseinf.find( { tags:{$size:4} } )//查询有四个元素的数组
-
limit和skip方法查询
db.goodsbaseinf.find().limit(k) //返回前k条文档 db.goodsbaseinf.find().skip(k) //显示第k+1条开始的文档
-
带$ or和$ in运算符的查询
db.goodsbaseinf.find( { $or:[ {name:"《高等数学上册》"}, {name:"《高等数学下册》"} ] } ) db.goodsbaseinf.find( { name:{ $in:["《高等数学上册》", "《高等数学下册》"] } } )
- $or直接查询键值对相同的文档记录
- $in指定查询指定查询键,然后&in里面输入要查找的值。
-
通过查询操作符来查询
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.goodsbaseinf.find({"by":"CSDN"}).pretty() | where by = 'CSDN' |
小于 | {<key>:{$lt:<value>}} | db.goodsbaseinf.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.goodsbaseinf.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.goodsbaseinf.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.goodsbaseinf.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.goodsbaseinf.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
db.goodsbaseinf.find(
{
price:{$gte:32}
}
)//查询价格大于等于32的值
db.goodsbaseinf.find(
{
price:{$gt:3, $lt:33}
}
)//查询价格范围(3,33)的值
db.goodsbaseinf.find(
{
$or:[
{price:{$gt:33}},
{price:{$lt:33}}
]
}
)//查询价格范围小于33和大于33的值
当然还有许多正则表达式,后续更新。