MongoDB基础操作

Posted yq055783

tags:

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

1.mongodb安装后了解

mongo.exe是客户端

mongod.exe是服务器
配置环境变量
默认 监听端口port=27017 3306是mysql,6379是redis的

2.启动配置

启动命令:mongod
直接在cmd输入mongod.exe启动服务器,报错。原因是没有配置好放数据的文件夹
解决方法:在G:mongodb新建一data文件夹,再在data文件夹里新建一db文件夹---》然后在cmd输入mongod --dbpath="G:/mongodb/data/db/"指定数据存储目录(默认是c盘)。
遇到阻塞状态即成功启动服务器 

3.mongodb介绍

Nosql数据库-----》非关系型数据库 mongodb是基于文件操作(redis是基于内存操作的)
mysql和mongodb对比: 

#mysql:
id name age gender height
1    yq    25   1      null
2    ys     22   null    187
#mongodb:
{
    id:1,
    name:yq,
    age:25,
    gender:1    
},
{
    id:2,
    name:ys,
    age:22,
    height:187
}

总结:Mongodb存储的是JSON数据

4.mongodb基本命令

在cmd输入mongo,打开客户端
指令:

1.show databases 查看本地数据库 -----》在本地磁盘中的
2.use databasename 切换当前使用的数据库
3.db 查看当前使用的数据库
4.show tables 查看当前数据库中的表 ------》在本地磁盘中的表

新建数据库:

use 不存在的数据库名 即创建该数据库 -----》在内存中创建
db.不存在的表名 即在数据库中创建该表 -----》也在内存中

**创建好后新数据库后,使用db可以查看当前的数据库,但使用show databases显示没有;同样新建的表用show tables查看也没有

原因:没有增删改查的数据写入。只要有一条就可以查看。

使用不存在的对象即创建该对象----》在内存里

5.mongodb的数据类型

ObjectId : 每条数据都会自动生成的id----------------》和库表无关 会自增
String : 字符串,必须是utf-8
Boolean :布尔值 true/false
Integer : 整数 (一般用Int32)
Double :浮点型 (没有float型)
Arrays :数组或列表
Object :字典
Null : 空数据类型
Timestamp:时间戳
Date :存储当前日期(不用,用时间戳)

nosqlbooster4mongo -----》mongodb可视化工具

6.增删改查

(1).增:insert

db.tablename.insert({},{})  #
#官方推荐写法:
db.tablename.insertOne({})   #插入一条
db.tablename.insertMany([{},{}])  #插入多条

(2).查 find

db.tablename.find({查询条件}) 查 -----》查询所有符合条件的数据
db.tablename.findOne({}) 查询符合条件的第一条数据
例子:    
db.tablename.find({查询条件}) 查询所有符合条件的数据
db.tablename.find({name:ys}) 条件查询
db.tablename.findOne({name:ys}) 只查询一条符合条件的
db.tablename.find({name:ys,age:25}) /*并列条件查询*/

$数据比较符 ------>仅用于数字型

$gt  >  db.tablename.find(age:{$gt:20})    #查询年龄大于20的记录
$gte >=  db.tablename.find(age:{$gte:20})   #大于等于
$lt  <  db.tablename.find(age:{$lt:20})  #小于
$lte <=   db.tablename.find(age:{$lte:20})  #小于等于
$eq  =
$ne  !=

(3).改 update

a.db.tablename.update({},{})  #改 --》修改符合条件的第一条数据
#官方推荐:
db.tablename.updateOne({},{}) # 修改符合条件的第一条数据
db.tablename.updateMany({},{}) # 修改符合条件的所有数据

b.修改器

所有mongodb的修改(update)全部基于修改器
修改器形式:

$修改器 关键字

常用修改器:

$set
强制将某字段值修改,如果该字段不存在,则创建该字段并赋值。

db.tablename.update({age:24},{$set:{age:44}})
db.tablename.update({name:ys},{$set:{age:44}})  #ys的age变为44    

$unset

删除字段

db.tablename.update({name:ys},{$unset:{age:1}}) # 后面那个必须写1

$inc

引用增加 -----》先引用原有数据,再在原有数据基础上增加(可是负数 -10)

db.tablename.update({name:ys},{$inc:{age:10}})  #给ys的age加10    

不常用:

针对Array List操作

$push==append
#在Array类型中增加数据,在最末端---》一条数据
db.tablename.update({name:ys},{$push:{hobby:7}}) #hobby是个列表
$pushAll==extends
#在Array类型中增加数据,在最末端---》多条数据----》必须是列表类型
db.tablename.update({name:ys},{$pushAll:{hobby:[6,8,9,11]}})
$pull==remove()
#删除所有符合条件的数据
db.tablename.update({name:ys},{$pull:{hobby:7}}) 
$pullAll
#遍历删除符合条件的数据
db.tablename.update({name:ys},{$pullAll:{hobby:[6,8,9,11]}})
$pop~pop()
#只能删除Array中的第一条和最后一条数据。第一条数据:-1;最后一条:1
db.tablename.update({name:ys},{$pop:{hobby:-1}}) #删除第一个数据
db.tablename.update({name:ys},{$pop:{hobby:1}}) #删除最后一条数据 pop的正为最后

c.$关键字

$是用来存储符合当前Array条件元素的下标索引

db.tablename.update({name:ys,hobby:4},{$set:{"hobby.$":5}}) #将hobby列表Array中的4改为5

当前Array---[1,2,3,4,5,6,7,8]

条件元素----hobby:4
当前Array的第4个元素符合条件,它的下标索引是3,当前的$就是3.通过“.索引”方式取值时,一定要用双引号包裹。如"字段.索引位置"
(4).删 remove

db.tablename.remove({查询条件})  #删 如果查询条件为空,则删除所有数据 危险!
#官方推荐:    
db.tablename.removeOne({})  # 删除符合条件的第一条数据
db.tablename.removeMany({})   # 删除所有符合条件的数据

7.选取 跳过 排序

(1).排序

db.tablename.find({}).sort({age:1}) # age是字段,是个列表,里面有字典,键为age,值为1,2,3,4等数字。 1代表递增(从小到大)-1代表降序

(2).跳过

db.tablename.find({}).skip(2)   #跳过两条 前面两条

(3).选取

db.tablename.find({}).limit(5)  #选5条 0、1、2、3、4------》如果数据条目大于全部数据,就全部查询

(4).例子 

db.tablename.find({}).skip(2).limit(4)  #跳过两条选4条 

sort和skip、limit三者顺序不管怎么组合,都是先排序,再跳过,最后选取。

(5)应用:分页(每页两条数据)

page sort skip limit
1     1    0     2
2     1    2     2
3     1    4     2
4     1    6     2

count = 2
page = 1
skip((page-1)*count) #跳过的页数
db.user.find({}).sort({age:-1}).skip((page-1)*count).limit(count)

8.python操作mongodb

pymongo

from pymongo import MongoClient
MC=MongoClient(127.0.0.1,27017) #创建连接 即创建mongodb客户端
db=MC[db10] #选择或者创建数据库(在内存) -----》use
player_info={
nickname:yq,
age:10,
year:1998,
height:178,
hobby:[{
name:basketball,
when:14,
},
{
name:book,
when:23
}
]
}
# 增加数据
db.player.insert_one(player_info)

查询数据:

(1).find({})

res=db.player.find({})
print(res) 
#<pymongo.cursor.Cursor object at 000002363EA630F0> 可遍历
print(res.inserted_id,type(res.inserted_id)) #当前新增数据的id
for i in res:
    print(i)

(2).find_one({})

res=db.player.find_one({}) #查询符合条件的第一条是数据
res=db.player.find_one({nickname:ys,height:{$gt:167}})
print(res)

(3)更新数据 update

res=db.player.update_one({nickname:yq},{$set:{year:1978}})
print(res)
res=db.player.update_many({},{$inc:{height:10}}) #给身高都增加10

(4)删除数据

res=db.player.delete_one({"_id":5e546fa5c3147e1517073b03}) #这样删不掉---》这个id不是字符串
from bson.objectid import ObjectId
res=db.player.delete_one({"_id":ObjectId(5e546fa5c3147e1517073b03)})
print(res.deleted_count) #0代表没有删除

(5)ObjectId不能被JSON序列化,要先转化 ----》pickle不确定

res=db.player.find_one({nickname:ys,height:{$gt:167}})
#转换id
res[_id]=str(res.get(_id)) #转化为字符串
res_json=json.dumps(res)
print(res_json) #Object of type ‘ObjectId‘ is not JSON serializable. 要将id转换下    

#排序 跳过 选取

from pymongo import ASCENDING,DESCENDING
res=db.player.find({}).limit(2).skip(1).sort(age,ASCENDING)
for i in res:
    print(i)

9.flask和Mongodb

flask接收到数据,数据是字典形式的,直接将字典存到MongoDb数据库中。
app应用中:
from flask import Flask, request, render_template, jsonify
from setting import MongoDb
app=Flask(__name__)

@app.route(/reg,methods=[POST,GET])
def reg():
    if request.method==GET:
        return render_template(reg.html)
    else:
        user_info=request.form.to_dict()
        res=MongoDb.user.insert_one(user_info)   #直接把字典存在数据库user表中(没有user表就新建)
        if res.inserted_id:
            return 注册成功
        else:
            return 注册失败

@app.route(/login,methods=[POST,GET])
def login():
    if request.method == GET:
        return render_template(login.html)
    else:
        user_info=request.form.to_dict()
        user_info_dict=MongoDb.user.find_one(user_info)
        user_info_dict[_id]=str(user_info_dict[_id])  #先把bson的id转化下成字符串
        return jsonify(user_info_dict)

if __name__ == __main__:
    app.run()

在settings.py文件中,使用数据库

from pymongo import MongoClient
MC=MongoClient(127.0.0.1,27017)
MongoDb=MC[db11]    

10.$or $and $all $in

#并列条件 $and
"$and":[{},{},{}]
res=list(MongoDB.user.find({"name":"ys","age":15}))
print(res[0])
res=list(MongoDB.user.find("$and":[{"name":"ys"},{"age":15}]))     #list()表示把查询出来的结果放在列表中,好取
#或条件 $or
res=MongoDB.user.find("$or":[{"name":"ys"},{"age":15}])
$all $in针对Array操作
$in:包含
res=MongoDB.user.find("name":{"$in":[111,222,333]})       #name中有111或者222或者333的都被查出来
$all----->自己查询---》后面条件是前面的子集

Mongodb小概念

Mysql : DataBase ---->Tables ---->Column Row
MongoDB DataBase Collections Field Documents

危险操作

MongoDB.user.drop() #删除表---》没有确认,直接删除
MongoDB.dropDatabase() #删除数据库,也没有确认,直接删除           一般删除前要先复制

 





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

mongodb 基础操作

100天精通Python(进阶篇)——第40天:pymongo操作MongoDB数据库基础+代码实战

node.js零基础详细教程:node.js操作mongodb,及操作方法的封装

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

node.js零基础详细教程:mongodb数据库操作

node.js零基础详细教程:node.js操作mongodb,及操作方法的封装