初识mongodb-增删改查

146 阅读2分钟

基本概念

  • 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
})