MongoDB的安装及其使用

本文详细介绍了MongoDB的安装步骤、环境变量配置,以及数据库的使用,包括增删改查操作。深入讲解了各种数据类型、查询方法,如比较运算、逻辑运算、范围查询等。此外,还探讨了权限管理和Python操作MongoDB的实例,适合初学者全面学习MongoDB。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

👨‍💻博客主页:i新木优子👀
🎉欢迎关注🔍点赞👍收藏⭐留言📝
🧚‍♂️寄语:人生在勤,不索何获👣
🙏作者水平有限,发现错误欢迎留言轰炸


前言:MongoDB是一个非关系型数据库(NoSQL). 非常适合超大数据集的存储, 通常爬虫工程师使用MongoDB作为数据采集的存储.

一、MongoDB的安装(windows)

首先去官网下载MongoDB的安装包, https://www.mongodb.com/try/download/community
在这里插入图片描述

1. 安装步骤

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2. 配置PATH环境变量

复制Mongo的bin路径
右击此电脑点击属性点击高级系统设置

在这里插入图片描述在这里插入图片描述在这里插入图片描述

win+R打开命令提示符,输入mongo出现下图的内容表示环境变量配置成功

在这里插入图片描述

二、MongoDB的简单使用

mongoDB中一些简单的操作

db: 当前正在使用的数据库
show dbs: 显示所有数据库
show databases: 显示所有数据库
use xxxx: 调整数据库
db.dropDatabase(): 删除数据库
show collections: 显示当前数据库中所有的集合(表)
db.collection_name.insert({})
db.createCollection(name, {options}) 创建集合 
db.collection_name.drop()  删除集合
db.collection_name.insert()  向集合中添加数据( 如果该集合不存在, 自动创建)
db.collection_name.isCapped() 判断是否有容量上限(判断该集合是否是固定容量的集合)

三、MongoDB的增删改查

1. mongodb中常见的数据类型(了解):

Object ID: 主键ID
String: 字符串
Boolean: 布尔值  
Integer: 数字
Doube: 小数
Arrays: 数组
Object: 文档(关联其他对象)  {sname: 小新, sage: 18, class:{cccc}}
Null : 空值 
Timestamp: 时间戳
Date: 时间日期

2. mongodb添加数据

db.collection_name.insert({字段:值,字段:值})
db.collection_name.insertOne({字段:值,字段:值})
db.collection_name.insertMany([{}, {}])

示例:

db.nor_col.insert({name:"新木优子", age:18, hobby:['吃', '喝', '玩']})
db.nor_col.insertOne({name:"新木优子", "age":18, "hobby":['吃', '喝', '玩']})
db.nor_col.insertMany([{name:"新木优子", age:18, hobby:['吃', '喝', '玩']}, {name:"新木优子", age:18, hobby:['吃', '喝', '玩']}])

注意: 如果集合不存在, 则会自动创建集合

3. mongodb修改数据

3.1 update更新
db.collection_name.update({查询条件}, {待修改内容}, {multi: 是否多条数据修改, upsert:true})

示例:

db.nor_col.update({name:"新木优子"}, {$set:{title:"yeti", hobby:['吃', '喝', '玩']}}, {multi:true});
db.nor_col.update({name:"新木优子"}, {title:"yeti"}) 

$set和没有$set的区别:
$set只会修改当前给出的字段, 其他内容保留
没有$set只会保留当前给出字段, 其他内容删除

mutil: 如果为True, 必须用$set. 否则报错.

3.2 保存(save, 了解)
db.collection_name.save({待保存数据})

注意, 如果save的内容中的_id如果存在就更新, 如果不存在就添加

db.nor_col.save({_id:'60fe1c75f76b22511a447852', name:"新", age:29})

4. mongodb删除数据

4.1 remove()
db.collection_name.remove({条件}, {justOne:true|false})

示例:

db.nor_col.remove({name:"小新"}, {justOne:true})
4.2 deleteOne()
db.collection_name.deleteOne({条件})

示例:

db.nor_col.deleteOne({name:"小新"})
4.3 deleteMany()
db.collection_name.deleteMany({条件})

示例:

db.nor_col.deleteMany({name:"小新"})

5. mongodb查询数据

准备数据:

db.stu.insert([
	{name: "刘亦菲", age:800, address:'安徽省凤阳', score: 160},
	{name: "朱棣", age:750, address:'江苏省南京市', score: 120},
	{name: "朱高炽", age:700, address:'北京紫禁城', score: 90},
	{name: "李嘉诚", age:38, address:'香港xxx街道', score: 70},
	{name: "麻花藤", age:28, address:'广东省xxx市', score: 80},
	{name: "大白", age:33, address:'火星第一卫星', score: -60},
	{name: "小新", age:33, address:'开普勒225旁边的黑洞', score: -160}
])
5.1 普通查询
db.stu.find({条件})  查询所有
db.stu.findOne({条件})  查询一个
db.stu.find().pretty()  将查询出来的结果进行格式化(好看一些)
5.2 比较运算
等于: 默认是等于判断, $eq
小于:$lt (less than) <
小于等于:$lte (less than equal) <=
大于:$gt (greater than)>
大于等于:$gte   >=
不等于:$ne  !=
db.stu.find({age:28})  查询年龄是28岁的学生信息
db.stu.find({age: {$eq: 28}})  查询年龄是28岁的学生信息
db.stu.find({age: {$gt: 30}})   查询年龄大于30岁的学生
db.stu.find({age: {$lt: 30}})   查询年龄小于30岁的学生
db.stu.find({age: {$gte: 38}})  查询年龄大于等于30岁的学生
db.stu.find({age: {$lte: 38}})  查询年龄小于等于30岁的学生
db.stu.find({age: {$ne: 38}})   查询年龄不等于38的学生
5.3 逻辑运算符
  1. and
    $and: [条件1, 条件2, 条件3…]
查询年龄等于33, 并且, 名字是"小新"的学生信息
db.stu.find({$and:[{age: {$eq:33}}, {name:'小新'}]})
  1. or
    $or: [条件1, 条件2, 条件3]
查询名字叫"李嘉诚"的, 或者, 年龄超过100岁的人
db.stu.find({$or: [{name: '李嘉诚'}, {age: {$gt: 100}}]})
  1. nor

    $nor: [条件1, 条件2, 条件3]

查询年龄不小于38岁的人, 名字还不能是刘亦菲. 
db.stu.find({$nor: [{age: {$lt: 38}}, {name: "刘亦菲"}]})

练练试试, 查询年龄 > 50岁或者分数 > 60分

5.4 范围运算符

​ 使用$in, $nin判断数据是否在某个数组内

db.stu.find({age: {$in:[28, 38]}})   年龄是28或者38的人
5.5 正则表达式

​ 使用$regex进行正则表达式匹配

db.stu.find({address: {$regex:'^北京'}})  查询地址是北京的人的信息
db.stu.find({address: /^北京/})  效果一样
5.6 自定义查询(了解)

mongo shell 是一个js的执行环境
使用$where 写一个函数, 返回满足条件的数据

db.stu.find({$where: function(){return this.age > 38}})
5.7 skip和limit
db.stu.find().skip(3).limit(3)	

跳过3个. 提取3个. 类似Mysql中的limit 3, 3 可以用来做分页

5.8 投影

投影可以控制最终查询的结果(字段筛选)

db.stu.find({}, {字段:1, 字段:1})

需要看的字段给1就可以了.

注意: 除了_id外, 0, 1不能共存.

5.9 排序

sort({字段:1, 字段:-1})

1表示升序
-1表示降序

对查询结果排序, 先按照age升序排列, 相同项再按照score降序排列
db.stu.find().sort({age:1, score: -1})  
5.10 统计数量

count(条件) 查询数量

db.stu.count({age:33})

四、MongoDB的权限管理

自己的机器可以不设置

mongodb的用户权限是跟着数据库走的. 除了超级管理员外. 其他管理员只能管理自己的库.

创建超级管理员

首先, 将数据库调整到admin库.

use admin

然后, 创建一个root超级管理员账号

db.createUser({user:"用户名", pwd: "密码", roles:['root']})
db.createUser({user:"sylar", pwd: "123456", roles:['root']})

创建完成后. 需要退出mongodb. 然后修改配置文件:

mac和linux:

dbpath=/usr/local/mongodb
port=27017
logpath=/usr/local/var/log/mongodb/mongo.log
fork=true
logappend=true
auth=true  # 加上账户认证

windows:

storage:
  dbPath: D:\MongoDB\Server\4.4\data
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path:  D:\MongoDB\Server\4.4\log\mongod.log

net:
  port: 27017
  bindIp: 127.0.0.1

# 注意: security要顶格, authorization要空两格, enabled前面要有个空格
security:
  authorization: enabled

然后, 需要重新启动mongodb的服务(linux和mac直接杀掉进程, 重新启动即可, windows去系统服务里重启MongoDB的服务).

然后重新打开mongo, 先进入admin, 登录超级管理员账号, 进入到你想要单独创建管理员的数据库. 然后创建出该数据库的管理员账号

> use admin
switched to db admin
> db.auth("sylar","123456")
1
> use ddd
switched to db ddd
> db.createUser({user:"ttt_admin", pwd:"123456", roles:["readWrite"]})

退出管理员账号, 重新登录刚刚创建好的账号

> use ddd
switched to db ddd
> db.auth("ttt_admin", "123456")
1
> db.stu.insert({name: 123, age:3})
WriteResult({ "nInserted" : 1 })
>

注意, 每个账号只能管理自己的数据库(可以是多个).

五、彩蛋✨

1. pymongo的使用

python处理mongodb首选就是pymongo. 首先, 安装这个模块

pip install pymongo

建立连接

import pymongo

conn = pymongo.MongoClient(host='localhost', port=27017)
# 切换数据库
py = conn['python']
# 登录该数据库(需要的话)
py.authenticate("python_admin", '123456')
# 简单来个查询
result = py["stu"].find()
for r in result:
    print(r)

完成增删改查

import pymongo
from pymongo import MongoClient


def get_db(database, user, pwd):
    client = MongoClient(host="localhost", port=27017)
    db = client[database]
    # 有账号就加上验证, 没有账号就不用验证
    db.authenticate(user, pwd)
    return db


# 增删改查
# 增加数据
def add_one(table, data):
    db = get_db("python", "python_admin", "123456")
    result = db[table].insert_one(data)
    return result


def add_many(table, data_list):
    db = get_db("python", "python_admin", "123456")
    result = db[table].insert_many(data_list)
    return result.inserted_ids


def upd(table, condition, data):
    db = get_db("python", "python_admin", "123456")
    data = {'hehe': 'hehe', 'meme': 'meme'}
    # result = db[table].update_many(condition, {"$set": data})
    result = db[table].update_many(condition, {'$set':data})
    return result


def delete(table, condition):
    db = get_db("python", "python_admin", "123456")
    result = db[table].remove(condition)
    return result


if __name__ == '__main__':
    # r = add_one("stu", {"name": "西瓜", "age":18})
    # print(r.inserted_id)
    # r = add_many("stu", [{"name": "嘎嘎"},{"name": "咔咔"}])
    # print(r.inserted_ids)

    # result = upd("stu", {"name": 99999}, {"age": 100})
    # print(result)

    result = delete("stu", {"name": "哈哈"})
    print(result)

2. 抓取某家数据存储到mongo

import requests
from lxml import etree
import pymongo

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}


# 获取页面源代码
def get_page_source(url):  
    resp = requests.get(url, headers=headers)
    return resp.text


# 解析页面源代码
def parse_data(page_source):  
    tree = etree.HTML(page_source)
    li_list = tree.xpath("//*[@class='sellListContent']/li")
    result = []
    for li in li_list:
        title = li.xpath(".//*[@class='title']/a/text()")
        if not title:
            continue
        title = title[0]
        position = li.xpath(".//*[@class='positionInfo']//text()")
        position = "".join(position).strip().replace(" ", "")
        house_info = li.xpath(".//*[@class='houseInfo']//text()")
        info = house_info[0].replace(" | ", ",")
        total = li.xpath(".//*[@class='priceInfo']/div[1]//text()")
        price = li.xpath(".//*[@class='priceInfo']/div[2]//text()")
        total = "".join(total)
        price = price[0]
        dic = {
            "title": title,
            "position": position,
            "info": info,
            "total": total,
            "price": price
        }
        result.append(dic)
    return result


# 将数据存储到mongo
def save_data(data):
    conn = pymongo.MongoClient(host="localhost", port=27017)
    db = conn['lianjia']
    db.data.insert_many(data)
    conn.close()


def main():
    url = "https://bj.lianjia.com/ershoufang/"
    page_source = get_page_source(url)
    data = parse_data(page_source)
    save_data(data)


if __name__ == '__main__':
    main()

运行程序,打开mongo就可以看到抓取的数据已经存储进去了,如下图所示:

在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i新木优子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值