mongodb相关

  • mongo:打开命令行

  • 进入数据库:use DBname。展示:show dbsshow collections

  • mongoimport mongoexport备份与恢复集合(collection)

    共同的相关配置:-d DBname -c COLname -h IPaddress:PORTname

    从filename导入:mongoimport [config] filename

    filename:mongoexport [config] -o filename

    导入数据要避免与原来的数据重复,先删除集合db.COLname.drop() 再mongoimport

  • MongoDB 数据库备份(mongodump)与恢复(mongorestore)

  • 命令行中打印变量print VARIABLE

  • 使用javascipt的数组迭代方法forEach map
    这样可以方便的操作字段名(field),如字段重命名、字段合并

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    db.getCollection('spaces').find({}).forEach(function(x) {
    if(x.in_company) {
    x.in_company = x.in_company.map(function(ele, i) {
    return {
    name: ele,
    website: x.in_company_url ? x.in_company_url[i] : null,
    }
    });
    delete x.in_company_url;
    db.spaces.save(x);
    }
    })
  • 加入表的关联:mongoose字段加入ref属性,查询时加入populate方法。

数据库操作

  • db.COLname.save()包含_id则为修改文档,不包含则与db.COLname.insert()功能相同

  • 查询时注意String(‘1’)与Number(1)的区别,在mongoose的保存save与更新update操作中,定义好Schema的字段类型后,则数字与字符串没有区别。

  • 查询不存在字段名或者字段的值为nulldb.COLname.find({"FIELD": null})

    相应的查询字段存在并且值为nulldb.COLname.find({"FIELD": {"$in":[null],"$exists":true}})
    查询存在该字段的文档{$exists: true}

  • 文档中的字段存储数组/对象时的查询:在文档{"fruits" : [ "apple", "pear", "orange" ] }

    字段的值为数组:
    找到数组中包含值:find({"fruits":"apple"})

    数组中包含多个值:find({"fruits":{"$all":["apple","banana"]}})

    数组中某个索引为某个值:find({"fruits.1":"orange"})

    精确查询,要求值相同并且顺序一致:
    find({"fruits":["apple","orange","pear"]})

    字段的值为对象数组时:使用精确匹配时,只会找出字段的值相等并且顺序一致的文档。
    要求包含某些键值对,注意与字段的值为对象时查询的区别:
    find({ "name.first":"joe", "name.middle":"bush" })

安全策略

设置用户权限

  • mongod --auth开启权限认证,再加入用户分配权限
  • TLS/SSL传输加密
  • 数据库定时备份
  • 不使用mongodb默认端口,防止端口扫描
  • 不需要公网连接时,bind_ip只允许本地访问

mongoose

mongoose的model名称为首字母大写时,存到mongodb时会自动首字母小写

mongodb版本6安装

安装MongoDB Community Server
安装MongoDB Shell