mongodb基本使用

Posted by sqq5682 on August 15, 2021

mongodb

安装教程 https://www.runoob.com/mongodb/mongodb-osx-install.html

进入 /usr/local

cd /usr/local

下载

sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz

解压

sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz

重命名为 mongodb 目录

sudo mv mongodb-osx-x86_64-4.0.9/ mongodb

vim ~/.zshrc 添加下面

export PATH=/usr/local/mongodb/bin:$PATH

source ~/.zshrc // 生效 创建日志及数据存放的目录: 数据存放路径:

sudo mkdir -p /usr/local/var/mongodb

日志文件路径:

sudo mkdir -p /usr/local/var/log/mongodb

接下来要确保当前用户对以上两个目录有读写的权限:

sudo chown runoob /usr/local/var/mongodb
sudo chown runoob /usr/local/var/log/mongodb

以上 runoob 是我电脑上对用户,你这边需要根据你当前对用户名来修改。

mongod -f /root/mongodb/etc/mongodb.conf  使用配置文件启动(服务器)

mongod --config /usr/local/etc/mongod.conf 启动本地mongodb (本地)

/usr/local/mongodb/bin  (本地进入)
./mongo // 进入mongodb操作模式

基本操作说明:

show dbs    // 查看数据库
use demo    // 选择数据库(没有的话创建)
db.dropDatabase()     // 删除数据库
show collections        // 查看集合
db.demo.drop()          // 删除集合
db.createCollection('demo')     // 创建集合
db.demo.insert({id:123,name:'conan'})       // 创建并插入集合
db.demo.update({id:'123',{$set:{name:'kids'}}}) // 更新文档
db.demo.update({id:'123',{$set:{'class.name':'jd'}}})   // 更新子集字段

db.demo.remove({id:123}) // 删除文档
db.demo.find()      // 查看集合
db.demo.find().pretty()     // 查看集合(格式化形式显示)
db.demo.findOne()      // 查看第一条集合的数据
db.demo.find({id:123})  // 按条件查询(findOne()同样用法)
db.demo.findOne({age:{$gt:20})  // 大于20($lt=>小于,$eq=>等于,$gte=>大于等于,$lte=>小于等于)
...

服务器上docker下mongodb操作

下载,取最新版的 MongoDB 镜像

docker pull mongo:latest

查看镜像

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/mongo latest 5285ea55 13 days ago 703 MB

安装成功: 查看容器运行信息

docker ps

使用以下命令添加用户和设置密码

docker run -d -p 27017:27017 --name mongo -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo --auth // 运行容器的时候设置管理员用户名

使用以下命令添加用户和设置密码,并且尝试连接。 a7e5ca69容器id

docker exec -it  a7e5d4a69  mongo // 查看本地镜像

尝试使用上面创建的用户信息进行连接。

db.auth('admin', '123456')

权限设置

我本地配置文件的路径是:vim data/mongodb/config/mongod.conf userKey

security:
    authorization: enabled // 设置启用登录验证 可设置disabled

完整的配置:

systemLog:
   destination: file
   path: "logs/mongodb/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "data/mongodb/db"
net:
   port: 27017
security:
    authorization: enabled

创建普通用户

>use test
> 
db.createUser(
  {
    user:"test",
    pwd: "test",
    roles: [{ role: "readWrite", db: "runoob"}]
  }
)
Successfully added user: {
        "user" : "test1",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ]
}
> exit

创建超极用户root

use admin
db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "root", db: "admin" } ]
  }
);

创建管理员账号: admin数据库是管理用户权限的数据库。

use admin
db.createUser(
  {
    user: "manage",
    pwd: "manage", // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

查看创建的用户

show users 或 db.system.users.find() 或 db.runCommand({usersInfo:"userName"})

修改密码

use admin
db.changeUserPassword("username", "xxx")

修改密码和用户信息

db.runCommand(
    {
        updateUser:"username",
        pwd:"xxx",
        customData:{title:"xxx"}
    }

mongodb增删改查操作

增加数据,语法: db.collectionName.isnert(document)。

#不指定文档的id,数据库会默认分配一个随机id

db.user.insert({name:'zhaos',age:23,sex:'f'});

#指定文档的id

db.user.insert({_id:5,name:'zhaos',age:23,sex:'f'});

#增加单个文档

db.user.insert({_id:6,name:'zhaos',age:23,sex:'f'});

#增加多个文档

db.user.insert([{_id:2,name:'zhangs',age:21,sex:'m'},{_id:3,name:'wangw',age:22,sex:'m'},{_id:4,name:'zhaos',age:23,sex:'f'}]);

删除数据,语法: db.collection.remove(查询表达式, 选项)。选项是指需要删除的文档数,{0/1},默认是0,删除全部文档。

#将所有_id=7的文档删除

db.user.remove({_id:7})  

#将gender:’m’的所有文档删除

db.user.remove({gender:'m'})

#只删除一个gender:’m’的文档,num是指删除的文档数

db.user.remove({gender:'m',1})

修改数据,语法: db.collection.update(查询表达式,新值);

从结果可以看出,这只是在替换一个文档,并非修改一个文档字段

> db.user.update({name:'zhangs'},{name:'liul'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find();
{ "_id" : 2, "name" : "liul" }

修改一个文档的字段,必须使用$set:{属性:’值’}

> db.user.update({name:'zhaos'},{$set:{name:'kongkong'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find();
{ "_id" : 6, "name" : "kongkong", "age" : 23, "sex" : "f" }

修改时的赋值表达式

$set 修改某列的值

db.user.update({name:'zhaos'},{$set:{name:'kongkong'}})

$unset 删除某个列

db.user.update({name:'kongkong'},{$unset:{name:'kongkong'}})

$rename 重命名某个列

db.user.update({_id:6},{$rename:{sex:'gender'}})
db.user.update({},{$rename:{'sex':'gender'}},{multi:true})

$inc 增长某个列

db.user.update({_id:6},{$inc:{age:2}})

$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段.

db.user.update({_id:7},{$setOnInsert:{age:5,gender:'f'}},{upsert:true})

查找数据,语法: db.collection.find(查询表达式,查询的列)。

#查询一个表中的所有文档

db.user.find()

#查询特定属性的文档

db.user.find({_id:3})

#查询所有文档,显示gender列,不显示id

db.user.find({},{gender:1,_id:0})

#查询所有gender:’m’的文档,显示gender列,age列,不显示id

db.user.find({gender:'m'},{gender:1,_id:0,age:1})

mongoose实际使用

mongoose安装

npm install mongoose

mongoose连接

const mongoose = require('mongoose')
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express,very good!' });
});
mongoose.connect('mongodb://test:test@127.0.0.1:27017/runoob?authSource=admin', { useNewUrlParser: true, useUnifiedTopology: true })

mongoose.connection.on('connected', () => {
    console.log('MongoDb connected successful!')
})

mongoose.connection.on('err', () => {
    console.log('MongoDb connected fail!')
})

mongoose.connection.on('disconnected', () => {
    console.log('MongoDb disconnected!')
})

一个user.js的Schema

/*
 定义一个user的Schema
*/
var mongoose = require('./db.js');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  username: { type: String }, // 用户名
  password: { type: String }, // 密码
  age: { type: Number }, // 年龄
});

/* model 是由schema生成的模型,具有对数据库操作的能力 */

module.exports = mongoose.model('User', UserSchema);

插入数据(Model.save([fn])),代码如下:

var User = require('./user.js');
// 插入数据

var user = new User({
  username: 'kongzhi0707',
  password: '123456',
  age: 30
});

user.save(function(err, res) {
  if (err) {
    console.log(err);
  } else {
    console.log(res);
  }
});

更新数据(Model.update(conditions, doc, [options], [callback]))

var User = require('./user.js');
// 更新数据 
function update() {
  // 更新数据的条件查询
  var wherestr = {'username': 'kongzhi0707'};

  // 执行更新数据
  var updatestr = {'password': 'abcdef'};

  User.update(wherestr, updatestr, function(err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res);
    }
  });
}
// 调用更新函数
update();

findByIdAndUpdate(id, [update], [options], [callback]);根据id进行更新;此id就是数据库中自动生成的id;如下代码,

var User = require('./user.js');
// 更新数据 
function update() {
  // 更新数据的条件查询
  var id = '5b3a4941ca11752732fee772';
  // 执行更新数据
  var updatestr = {'password': 'vvvvv'};
  User.findByIdAndUpdate(id, updatestr, function(err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res);
    }
  });
}
// 调用更新函数
update();

删除 Model.remove(conditions, [callback])

var User = require('./user.js');

function del() {
  // 删除数据的条件
  var wherestr = {'username': 'kongzhi0707'};
  User.remove(wherestr, function(err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res);
    }
  });
}
// 调用函数
del();

条件查询 Model.find(conditions, [fields], [options], [callback]); 如下代码所示:

var User = require('./user.js');
function find() {
  // 删除数据的条件
  var wherestr = {'userName': '龙恩0707'};
  User.find(wherestr, function(err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res);
    }
  });
}
// 调用函数
find();

数量查询 Model.count(conditions, [callback])

var User = require('./user.js');
function getCountByConditions() {
  User.count({}, function(err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res); // 会输出数据库数据的数量
    }
  });
}
// 调用函数
getCountByConditions();