基本概念
database:数据库collection: 集合,相当于Mysql中的表
基本使用
创建数据库
// 1.创建数据库 第一次执行的时候创建
use('coolcar')
插入数据
// 1.创建数据库 只会创建一次
use('coolcar')
// db.sales.drop()
// 2.创建集合(数据表)并插入数据
// 第一次使用db.account 会创建集合account
// insertOne插入一个数据
db.account.insertOne({
_id: "user345", // id不能重复
open_id:"456",
login_count:0.
})
// 插入多个数据
db.account.insertMany([{
// 不给id会创建一个新的记录
open_id: '456',
login_count: 0,
},{
open_id: "789",
login_count: 5,
}])
查询
查询全部
// 查询所有
db.account.find()
结果
[
{
"_id": "user345",
"open_id": "456",
"login_count": 0
},
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef95"
},
"open_id": "456",
"login_count": 0
},
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef96"
},
"open_id": "789",
"login_count": 5
}
]
查询一个
// 查询一个
db.account.findOne({
login_count:0
})
结果
{
"_id": "user345",
"open_id": "456",
"login_count": 0
}
条件查询
// 1.单个条件查询
db.account.find({
_id: ObjectId("63e92769dc2b55fbb2f1ef95")
})
db.account.find({
login_count: 0
})
// 2.查询login_count大于2的数据
// $ge代表大于
// $gte代表大于等于
// $lt代表小于
// $lte代表小于等于这里就演示了
db.account.find({
login_count:{$gt:2}
})
// 3.And查询 login_count大于2并且open_id='1234'的数据 ''与""是一样的
db.account.find({
login_count:{$gt:2},
open_id: '1234',
})
// 4.Or查询 login_count大于4并且open_id='1234'或者login_count=0的数据
// ''与""是一样的
db.account.find({
$or:[
{
login_count: {$gt:4},
open_id:'1234',
},
{
login_count:0
}
]
})
结果
[
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef95"
},
"open_id": "456",
"login_count": 0
}
]
// 第二个
[
{
"_id": "user345",
"open_id": "456",
"login_count": 0
},
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef95"
},
"open_id": "456",
"login_count": 0
}
]
...
// Or查询
[
{
"_id": "user345",
"open_id": "456",
"login_count": 0
},
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef95"
},
"open_id": "1234",
"login_count": 0
}
]
更新
更新一个或多个
db.account.update({
_id: ObjectId("63e92769dc2b55fbb2f1ef95")
},{
$set: {
login_count: 1 // 把查询到id的数据的login_count设为1
}
},
// { 代表修改一个还是多个
// multi:
// }
)
// 也可以使用updateOne只更新一个
单条记录的原子性
mongodb 虽然对事务没有那么多的要求(如果对事务的要求较高,可以使用关系型数据库),但是对于单条记录的 update 还是具有原子性的
db.account.update({
_id: ObjectId("63e92769dc2b55fbb2f1ef95")
},{
$inc: { // 每次将login_count加1
login_count: 1
},
$set:{ // 将open_id改为"1234"
open_id: "1234"
}
}
)
更新并添加内容
db.account.update({
_id: ObjectId("63e92769dc2b55fbb2f1ef95")
},{
$set:{
profile:{
name: 'abc',
age:28,
photo_url:'https://example.com/123'
}
}
}
)
// 查询小于等于30岁的
db.account.find({
"profile.age": {$lte:30}
})
结果
[
{
"_id": {
"$oid": "63e92769dc2b55fbb2f1ef95"
},
"open_id": "1234",
"login_count": 0,
"profile": {
"name": "abc",
"age": 28,
"photo_url": "https://example.com/123"
}
}
]
删除
db.account.deleteOne({
_id:"user456"
})
建立索引
如果我们不建立索引,会一条一条记录的找,比较慢,我们可以建立索引提高查询速度
// 1代表从小到大
// -1代表从大到小
db.account.createIndex({
"profile.age":1 // 从小到大
})
db.account.createIndex({
"open_id":-1 // 从大到小
})
练习
练习一:查询并插入
// 查找并插入
function resolveOpenID(open_id){
return db.account.updateOne({
open_id:open_id // 找到open_id为我们传入的open_id
},{
$set: {
open_id: open_id // 更新open_id
}
},{
upsert: true // 如果找不到就插入新的数据
})
}
resolveOpenID('999')
练习二:查找并插入 并返回新的数据内容
// 查找并插入 并返回新的数据内容
function resolveOpenID(open_id){
return db.account.findAndModify({
query:{
open_id:open_id // 找到open_id为我们传入的open_id
},
update:{
open_id: open_id // 更新open_id
},
upsert: true, // 如果找不到就插入新的数据
new: true // 返回更新后的数据
})
}
// 如果777不存在 resolveOpenID同时调用2次 那就不能保证upsert的原子性了 会产生两条数据
// 我们可以通过建立索引解决这个问题
resolveOpenID('777')
// 给open_id创建索引 保证原子性 唯一
db.account.createIndex({
open_id: 1
},{
unique:true
})