Mongodb数据库基本操作

Posted jason-gan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb数据库基本操作相关的知识,希望对你有一定的参考价值。

启动mongodb的服务端和客户端

启动服务端

  • sudo service mongod start 或者 sudo mongod

    • sudo mongod --config /etc/mongod.conf &(加&表示后台运行)

启动客户端

  • mongo

mongodb中数据库和集合的命令
  • 数据库不需要提前创建,插入数据时,自动创建

  • show dbs /show databases # 查看所有数据库

  • use 数据库名 # 使用数据库 (可以是一个当前不存在的数据库,当其中创建了集合,则该数据库才正式创建,否则退出后依然没有)

  • 数据库名.dropDatabase() # 删除数据库

 

  • db # 查看当前所在的数据库

  • 集合不需要提前创建,插入数据时,自动创建

  • show collections # 查看所有的集合

  • db.集合名.drop() # 删除集合

  • db.集合名.find() # 集合的使用

  • db.集合名.insert({key1:value1,keys:value2,....}) # 集合插入数据

  

> show dbs
admin  (empty)
local  0.078GB
> use test0322
switched to db test0322
> show dbs
admin  (empty)
local  0.078GB
> db.createCollection("test")
> show dbs
admin     (empty)
local     0.078GB
test0322  0.078GB
> show collections
system.indexes
test
> db.test.find()
> db.test.insert({gender:"boy",_id:"1001"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : "1001", "gender" : "boy" }
> db.test.insert({gender:"boy"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : "1001", "gender" : "boy" }
{ "_id" : ObjectId("5c94ebcd09befcda98f4448d"), "gender" : "boy" }

删除数据库的命令: 先要切换到要删除的库 db.dropDatabase()

删除集合的命令: db.集合名.drop()

命令:db.集合名称.remove(<query>,{justOne: <boolean>})

  • db.集合名.remove({条件},{justOne:false}) # 默认删除全部,值为false,如果只删除一条,需要把值设为true或1.

比较运算符

插入测试数据

db.test1.insert([
{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },
{"name" : "?蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },
{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },
{"name" : "?药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },
{"name" : "段誉", "hometown" : "?理", "age" : 16, "gender" : true },
{"name" : "段王爷", "hometown" : "?理", "age" : 45, "gender" : true },
{"name" : "洪七公", "hometown" : "华?", "age" : 18, "gender" : true }
])
  • 等于: 默认是等于判断, 没有运算符

  • ?于:$lt (less than)

  • ?于等于:$lte (less than equal)

  • ?于:$gt (greater than)

  • ?于等于:$gte

  • 不等于:$ne

db.test1.find({age:{$gt:18}})
逻辑和范围运算符

or:使?$or, 值为数组, 数组中每个元素为json

  查询年龄?于18, 或性别为false的学?
db.test1.find({$or:[{age:{$gt:18},gender:false}]})
?
查询年龄?于等于18或性别为男?, 并且姓名是郭靖
db.test1.find({$or:[{age:{$gte:18},gender:true}],name:‘gj‘})

使?$in$nin 判断数据是否在某个数组内

 查询年龄为18、 28的学?
db.test1.find({age:{$in:[18,28]}})
支持正则表达式

使?//或$regex编写正则表达式

插入测试数据

db.regex.insert([
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description" },
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" },
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" },
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }
])

查询sku以abc开头的数据
db.regex.find({sku:/^abc/})

查询sku以789结尾的数据
db.regex.find({sku:{$regex:‘789$‘}})

skip 和 limit
  • ?法limit(): ?于读取指定数量的?档

      db.集合名称.find().limit(NUMBER)
    查询2条学?信息
    db.test1.find().limit(2)
  • ?法skip(): ?于跳过指定数量的?档

      db.集合名称.find().skip(NUMBER)
     
  • 同时使用

      db.stu.find().limit(4).skip(5)

    db.stu.find().skip(5).limit(4)
    提示

    注意:先使用skip在使用limit的效率要高于前者

投影&排序&统计&去重

投影命令:db.集合名称.find({},{字段名称:1,...})

db.test1.find({},{name:1,_id:0})

排序命令:db.集合名称.find().sort({字段:1,...})

db.test1.find().sort({age:1,gender:-1})

统计命令:db.集合名称.find({条件}).count() or 命令:db.集合名称.count({条件})

db.test1.count({age:{$gt:18},gender:true})

去除重复命令:db.集合名称.distinct(‘去重字段‘,{条件})

db.test1.distinct(‘hometown‘)

 

聚合操作

语法:db.集合名称.aggregate({管道:{表达式}})

常用管道命令

在mongodb中,?档处理完毕后, 通过管道进?下?次处理 常用管道命令如下:

  • $group: 将集合中的?档分组, 可?于统计结果

  • $match: 过滤数据, 只输出符合条件的?档

  • $project: 修改输??档的结构, 如重命名、 增加、 删除字段、 创建计算结果

  • $sort: 将输??档排序后输出

  • $limit: 限制聚合管道返回的?档数

  • $skip: 跳过指定数量的?档, 并返回余下的?档

常用表达式

表达式:处理输??档并输出 语法:表达式:‘$列名‘ 常?表达式:

  • $sum: 计算总和, $sum:1 表示以?倍计数

  • $avg: 计算平均值

  • $min: 获取最?值

  • $max: 获取最?值

  • $push: 在结果?档中插?值到?个数组中

   

# group
db.test1.aggregate({$group:{_id:$gender,counter:{$sum:1}}})
{ "_id" : false, "counter" : 18 }
{ "_id" : true, "counter" : 27.8 }


# group by null
db.test1.aggregate({$group:{_id:null,counter:{$sum:1}}})
{ "_id" : null, "counter" : 7 }


# 数据透视
db.test1.aggregate({$group:{_id:null,name:{$push:$name}}})
{ "_id" : null, "name" : [ "郭靖", "?蓉", "华筝", "?药师", "段誉", "段王爷", "洪七公" ] }
#使用$$ROOT可以将整个文档放入数组中
db.test1.aggregate({$group:{_id:null,name:{$push:$$ROOT}}})

# 练习
# 添加测试数据
db.user.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "b" },{  "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "c" },{  "country" : "china", "province" : "bj", "userid" : "da" },{  "country" : "china", "province" : "bj", "userid" : "fa" }])

# 需要统计出每个country/province下的userid的数量(同一个userid只统计一次)
db.user.aggregate({$group:{_id:{country:$country,province:$province,userid:$userid}}},{$group:{_id:{country:$_id.country,province:$_id.province},count:{$sum:1}}})
# { "_id" : { "country" : "china", "province" : "sh" }, "count" : 3 }
# { "_id" : { "country" : "china", "province" : "bj" }, "count" : 2 }

# match  查询
db.test1.aggregate({$match:{age:{$gt:18}}},{$group:{_id:$gender,count:{$sum:1}}})
# { "_id" : true, "count" : 3 }

# project 用于修改文档的输入输出结构,比如重命名,增加,删除字段

db.test1.aggregate({$project:{_id:0,name:1,age:1}})  # 投影

db.user.aggregate({$group:{_id:{country:$country,province:$province,userid:$userid}}},{$group:{_id:{country:$_id.country,province:$_id.province},count:{$sum:1}}},{$project:{_id:0,country:$_id.country,province:$_id.province,counter:$count}})
‘‘‘
{ "country" : "china", "province" : "sh", "counter" : 3 }
{ "country" : "china", "province" : "bj", "counter" : 2 }
‘‘‘

# sort
 db.test1.aggregate({$group:{_id:$gender,count:{$sum:1}}},{$sort:{count:1}})
# { "_id" : false, "count" : 2 }
# { "_id" : true, "count" : 5 }

# skip & limit
 db.test1.aggregate(
     {$group:{_id:"$gender",counter:{$sum:1}}},
     {$sort:{counter:-1}},
     {$skip:1},
     {$limit:1}
 )
# { "_id" : false, "counter" : 2 }
mongodb创建简单的索引方法
  • 语法:

    • db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序

    • db.集合.createIndex({属性:1})

    • 上面两个命令效果等价

  • 具体操作:db.db_name.ensureIndex({name:1})

索引的查看

默认情况下_id是集合的索引

查看方式:db.collection_name.getIndexes()

创建唯一索引

db.collection_name.ensureIndex({"name":1},{"unique":true})

删除索引

语法:db.t1.dropIndex({‘索引名称‘:1})

建立符合索引

建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})

mongodb的备份和恢复

  • 备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

  • -h: 服务器地址, 也可以指定端?号

  • -d: 需要备份的数据库名称

  • -o: 备份的数据存放位置, 此?录中存放着备份出来的数据

示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

  • -h: 服务器地址

  • -d: 需要恢复的数据库实例

  • --dir: 备份数据所在位置

示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

 

manogodb与python的交互

pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo

技术图片
from pymongo import MongoClient

# 创建数据库连接对象
client = MongoClient(host=127.0.0.1,port=27017)
# 选择具体的存储数据库和集合,client[db_name][collection]
collection = client[test0322][t1]

# 插入一条数据
# ret = collection.insert_one({‘name‘:‘jason‘,‘age‘:26})
# print(ret)

# 插入多条数据
# item_list = [{‘name‘:‘py_{}‘.format(i)} for i in range(10)]
# t = collection.insert_many(item_list)

# 查询一条数据
# t = collection.find_one({‘name‘:‘py_0‘})
# print(t)

# 查询全部数据
t = collection.find({name:py_9})
#结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,
# 可以使用强制类型转换成列表就可重复从列表中取值 t = list(t)
for i in t:
    print(i)
print(**100)

for i in t: #此时t中没有内容
    print(i)


#更新一条数据
# collection.update({‘name‘:‘py_1‘},{‘$set‘:{‘name‘:‘py_2‘}})

# 更新全部数据
# collection.update_many({‘name‘:‘py_2‘},{‘$set‘:{‘name‘:‘py_0‘}})

# 删除一条数据
# collection.delete_one({‘name‘:‘py_0‘})

# 删除全部数据
# collection.delete_many({‘name‘:‘py_0‘})
View Code

以上是关于Mongodb数据库基本操作的主要内容,如果未能解决你的问题,请参考以下文章

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

VSCode自定义代码片段——git命令操作一个完整流程

Springboot 整合mongodb以及mongo数据操作工具类代码实现

VSCode自定义代码片段15——git命令操作一个完整流程