mongodb基础操作


前言

本文主要针对的是mongoDB的基本操作,以及使用python语言对mongodb的接口调用。
使用工具为pycharme
robot 3T【已经被收购,推出了收费版。robot 3T还是免费的】

简单的curd

mongDB终端的调用
添加
单条插入,再插入的时候会自动创建集合。但是没有插入数据mongodb是不会给该数据库创建集合的
db.basic.insert({"banner":
              {"version":"1.5.10",
                "name":"banana",
"url":"https://d8adcj2p1hmcm.2a5af24a944943436.png",
                "start_time":1656604800,
                "end_time":1656604800}})

多条批量插入
db.basic.insertMany([
{
   "banner": {
       "version": "1.5.10",
       "name": "rabbit",
       "url": "https://d8adc72f2dda2a5af24a944943436.png",
       "start_time": 1656604800,
       "end_time": 1656604800
  },
   "total":2,
   "category_id": "d6e3af40-3d42-315d-a983-ce745277593f"
},
{
   "banner": {
       "version": "1.5.11",
       "name": "oppo",
       "url": "https://d8adcj22dda2a5af24a944943436.png",
       "start_time": 1656604800,
       "end_time": 1656604800
  },
   "total":5,
   "category_id": "d6eeaf40-3c42-315d-a983-ce745277593f"
},
{
   "banner": {
       "version": "1.5.12",
       "name": "huawei",
       "url": "https://d8adcj2p12dda2a5af24a944943436.png",
       "start_time": 1656604800,
       "end_time": 1656604800
  },
   "total":10,
   "category_id": "d6e33440-3c42-315d-a983-ce745277593f"
},
{
   "banner": {
       "version": "1.5.13",
       "name": "xiaomi",
       "url": "https://f40c06c8071321a872f2dda2a5af24a944943436.png",
       "start_time": 1656604800,
       "end_time": 1656604800
  },
   "total":20,
   "category_id": "06e3af40-3c42-315d-a983-ce745277593f"
},
{
   "banner": {
       "version": "1.5.13",
       "name": "apple",
       "url": "https://f40c06c8071321a872f2dda2a5af24a944943436.png",
       "start_time": 1656604800,
       "end_time": 1656604800
  },
   "total":7,
   "category_id": "d6e3af40-3c42-315d-a983-ce745277593f"
}
])
               
注意insert是insertOne于insertMany的并集,insert是很老的版本使用不建议再使用
查看

条件查询

查看所有的数据
db.basic.find({})
查看total值大于10
db.basic.find({"total":{"$gt":10}})
查看total为空,即不存在total的字段的文档
db.basic.find({"total":{"$ne":null}})

查询total>10,定义展示的字段banner,total,但是默认还会展示_id
db.basic.find({"total":{"$gt":10}},{"banner":true,"total":true})
查询total>10,定义展示的字段banner的version字段,total,不展示_id;
db.basic.find({"total":{"$gt":10}},{"banner.version":true,"total":true,"_id":0})
如果没有total,将不展示total
db.basic.find({"total":{"$eq":null}},{"banner.version":true,"total":true,"_id":0})

db.basic.count({})
修改
db.basic.updateOne({"total":{"$eq":2}},
                  {"$set":{"banner.version":"1.8.1"}}
                  )

db.basic.updateMany({"total":{"$gt":10}},
                  {"$set":{"banner.version":"1.6.1"}}
                  )

注意
update 已被弃用,返回{n:1, nModified:1}
返回{n:1, nModified:1}
更新一个就用updateOne,是对update的封装,不支持{multi:true}属性,加了也没用,返回{n:1, nModified:1}
返回{n:1, nModified:1}
更新多个就用updateMany,是对update的封装,自动加入了{multi:true}属性,设为false也不行,返回{n:1, nModified:1}
返回{n:1, nModified:1}
删除
db.basic.deleteOne({"total":{"$eq":7}})
db.basic.deleteMany({"total":{"$eq":7}})
python的调用
"""
@author:taipi
desc:处理一次增删改查
"""
from bson import ObjectId
from pymongo import MongoClient
from mongo.config import host,port,username,password
client = MongoClient(host=host,port=port,username=username,password=password)
collection = client.mongo_basic.mongo_basic

data_list = [
  {'name': '朱小三', 'age': 20, 'address': '北京'},
  {'name': '刘小四', 'age': 21, 'address': '上海'},
  {'name': '马小五', 'age': 22, 'address': '山东'},
  {'name': '夏侯小七', 'age': 23, 'address': '河北'},
  {'name': '公孙小八', 'age': 24, 'address': '广州'},
  {'name': '慕容小九', 'age': 25, 'address': '杭州'},
  {'name': '欧阳小十', 'age': 26, 'address': '深圳'},

]
# 插入操作
collection.insert_many(data_list)

# 更新操作
result = collection.update_many(
  {'name': '马小五'},
  {'$set': {'address': '鞍山', 'age': 32}}
)

result = collection.update_one({'name': '隐身人'},
                              {'$set': {'name': '隐身人','age': 0,'address': '里世界'}},
                              upsert=True)

# 3. 删除
result = collection.delete_many({'age': 0})
print(result)

# 4. 查询
rows = collection.find({})
# 条件查询
rows = collection.find({'age': {'$lt': 25, '$gt': 21},
                       'name': {'$ne': '夏侯小七'}})
# 1. 空值
rows = collection.find({'grade': None})

# 2. 布尔值
rows = collection.find({'student': True}, {'_id': 0})

# 3. 排序参数
rows = collection.find({}, {'_id': 0}).sort('age', -1)

# 4. 查询_id
rows = collection.find({'_id': ObjectId('5b2f75d26b78a61364d09f45')},
                      {'_id': 0})
for row in rows:
   print(row)

高级查询

aggregate一般聚合查询

edcation集合
/* 1 */
{
  "_id" : ObjectId("630807cc0337dacc9a895997"),
  "name" : "李大娃",
  "age" : 10,
  "grade" : "五年级",
  "student" : true,
  "interest" : "唱歌"
}

/* 2 */
{
  "_id" : ObjectId("630807cc0337dacc9a895998"),
  "name" : "张二娃",
  "age" : 12,
  "grade" : "六年级",
  "student" : true,
  "interest" : "跳舞"
}

/* 3 */
{
  "_id" : ObjectId("630807cc0337dacc9a895999"),
  "name" : "马三娃",
  "age" : 14,
  "grade" : "八年级",
  "student" : true,
  "interest" : "下棋"
}

/* 4 */
{
  "_id" : ObjectId("630807cc0337dacc9a89599a"),
  "name" : "刘四娃",
  "age" : 16,
  "grade" : null,
  "student" : false,
  "interest" : "无"
}

/* 5 */
{
  "_id" : ObjectId("630807cc0337dacc9a89599b"),
  "name" : "朱五娃",
  "age" : 18,
  "grade" : "高三",
  "student" : true,
  "interest" : "写字"
}

/* 6 */
{
  "_id" : ObjectId("630807cc0337dacc9a89599c"),
  "name" : "高六娃",
  "age" : 8,
  "grade" : "一年级",
  "student" : true,
  "interest" : "学习"
}

/* 7 */
{
  "_id" : ObjectId("630807cc0337dacc9a89599d"),
  "name" : "赵气娃",
  "age" : 10,
  "grade" : "五年级",
  "student" : true,
  "interest" : "乐高"
}

/* 8 */
{
  "_id" : ObjectId("630807cc0337dacc9a89599e"),
  "name" : "葫芦娃",
  "age" : 100,
  "grade" : null,
  "student" : false,
  "interest" : "喷火"
}

/* 9 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499d5"),
  "name" : "李大娃",
  "age" : 10,
  "grade" : "五年级",
  "student" : true,
  "interest" : "唱歌"
}

/* 10 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499d6"),
  "name" : "张二娃",
  "age" : 12,
  "grade" : "六年级",
  "student" : true,
  "interest" : "跳舞"
}

/* 11 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499d7"),
  "name" : "马三娃",
  "age" : 14,
  "grade" : "八年级",
  "student" : true,
  "interest" : "下棋"
}

/* 12 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499d8"),
  "name" : "刘四娃",
  "age" : 16,
  "grade" : null,
  "student" : false,
  "interest" : "无"
}

/* 13 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499d9"),
  "name" : "朱五娃",
  "age" : 18,
  "grade" : "高三",
  "student" : true,
  "interest" : "写字"
}

/* 14 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499da"),
  "name" : "高六娃",
  "age" : 8,
  "grade" : "一年级",
  "student" : true,
  "interest" : "学习"
}

/* 15 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499db"),
  "name" : "赵气娃",
  "age" : 10,
  "grade" : "五年级",
  "student" : true,
  "interest" : "乐高"
}

/* 16 */
{
  "_id" : ObjectId("630a0c6bfd4705dee45499dc"),
  "name" : "葫芦娃",
  "age" : 100,
  "grade" : null,
  "student" : false,
  "interest" : "喷火"
}

/* 17 */
{
  "_id" : ObjectId("630a0ca0f831c4217f439fd7"),
  "name" : "李大娃",
  "age" : 110,
  "grade" : "五年级",
  "student" : true,
  "interest" : "唱歌"
}

/* 18 */
{
  "_id" : ObjectId("630a0ca0f831c4217f439fd8"),
  "name" : "张二娃",
  "age" : 132,
  "grade" : "六年级",
  "student" : true,
  "interest" : "跳舞"
}

/* 19 */
{
  "_id" : ObjectId("630a0ca0f831c4217f439fd9"),
  "name" : "高六娃",
  "age" : 28,
  "grade" : "一年级",
  "student" : true,
  "interest" : "学习"
}

/* 20 */
{
  "_id" : ObjectId("630a0ca0f831c4217f439fda"),
  "name" : "赵气娃",
  "age" : 190,
  "grade" : "五年级",
  "student" : true,
  "interest" : "乐高"
}

/* 21 */
{
  "_id" : ObjectId("630a0ca0f831c4217f439fdb"),
  "name" : "葫芦娃",
  "age" : 1100,
  "grade" : null,
  "student" : false,
  "interest" : "喷火"
}
basic集合
/* 1 */
{
  "_id" : ObjectId("630979f17b63fa7fc2f1d687"),
  "banner" : {
      "version" : "1.5.10",
      "name" : "banana",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  }
}

/* 2 */
{
  "_id" : ObjectId("63097c877b63fa7fc2f1d688"),
  "banner" : {
      "version" : "1.8.1",
      "name" : "rabbit",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 2.0,
  "category_id" : "d6e3af40-3d42-315d-a983-ce745277593f"
}

/* 3 */
{
  "_id" : ObjectId("63097c877b63fa7fc2f1d689"),
  "banner" : {
      "version" : "1.5.11",
      "name" : "oppo",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 5.0,
  "category_id" : "d6eeaf40-3c42-315d-a983-ce745277593f"
}

/* 4 */
{
  "_id" : ObjectId("63097c877b63fa7fc2f1d68a"),
  "banner" : {
      "version" : "1.5.12",
      "name" : "huawei",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 10.0,
  "category_id" : "d6e33440-3c42-315d-a983-ce745277593f"
}

/* 5 */
{
  "_id" : ObjectId("63097c877b63fa7fc2f1d68b"),
  "banner" : {
      "version" : "1.6.1",
      "name" : "xiaomi",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 20.0,
  "category_id" : "06e3af40-3c42-315d-a983-ce745277593f"
}

/* 6 */
{
  "_id" : ObjectId("630989b37b63fa7fc2f1d68d"),
  "banner" : {
      "version" : "1.5.10",
      "name" : "rabbit",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 2.0,
  "category_id" : "d6e3af40-3d42-315d-a983-ce745277593f"
}

/* 7 */
{
  "_id" : ObjectId("630989b37b63fa7fc2f1d68e"),
  "banner" : {
      "version" : "1.5.12",
      "name" : "huawei",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 10.0,
  "category_id" : "d6e33440-3c42-315d-a983-ce745277593f"
}

/* 8 */
{
  "_id" : ObjectId("630989b37b63fa7fc2f1d68f"),
  "banner" : {
      "version" : "1.5.13",
      "name" : "xiaomi",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 20.0,
  "category_id" : "06e3af40-3c42-315d-a983-ce745277593f"
}

/* 9 */
{
  "_id" : ObjectId("630989b37b63fa7fc2f1d690"),
  "banner" : {
      "version" : "1.5.13",
      "name" : "apple",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 7.0,
  "category_id" : "d6e3af40-3c42-315d-a983-ce745277593f"
}

/* 10 */
{
  "_id" : ObjectId("630989dc7b63fa7fc2f1d691"),
  "banner" : {
      "version" : "1.5.10",
      "name" : "rabbit",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 2.0,
  "category_id" : "d6e3af40-3d42-315d-a983-ce745277593f"
}

/* 11 */
{
  "_id" : ObjectId("630989dc7b63fa7fc2f1d692"),
  "banner" : {
      "version" : "1.5.12",
      "name" : "huawei",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 10.0,
  "category_id" : "d6e33440-3c42-315d-a983-ce745277593f"
}

/* 12 */
{
  "_id" : ObjectId("630989dc7b63fa7fc2f1d693"),
  "banner" : {
      "version" : "1.5.13",
      "name" : "xiaomi",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 20.0,
  "category_id" : "06e3af40-3c42-315d-a983-ce745277593f"
}

/* 13 */
{
  "_id" : ObjectId("630989dc7b63fa7fc2f1d694"),
  "banner" : {
      "version" : "1.5.13",
      "name" : "apple",
      "url" : "https://d8adcj2p1hmcm.cloudfront.net/thumbnail/f40c06c8071321a872f2dda2a5af24a944943436.png",
      "start_time" : 1656604800.0,
      "end_time" : 1656604800.0
  },
  "total" : 7.0,
  "category_id" : "d6e3af40-3c42-315d-a983-ce745277593f"
}
具体实操
aggregate在很多场景都是可以被find实现的,但其的优势在于组合
1)match用法
db.edcation.aggregate(
  [{"$match":{"age":{"$gte":10}}}])
  其本质和find没有什么区别
  db.edcation.find({"age":{"$gte":10}})
2)返回一部分字段project的用法
db.edcation.aggregate(
[{"$match":{"age":{"$gte":10}}},
{"$project":{"_id":0,"name":true,"interest":true}}])
其本质与find的第二括号一致
db.edcation.find({"age":{"$gte":10}},{"_id":0,"name":true,"interest":true})
3)临时添加固定字段"hello",find实现不了
db.edcation.aggregate(
[{"$match":{"age":{"$gte":10}}},
{"$project":{"_id":0,"name":true,"interest":true,"hello":"world"}}])
4)给新字段动态赋值,find实现不了
db.edcation.aggregate(
[{"$match":{"age":{"$gte":10}}},
{"$project":{"_id":0,"name":true,"hobby":"$interest"}}])
5)给现有字段"student"重新赋值,但是这是一个查询性赋值不会修改数据库中真实的内容
db.edcation.aggregate(
[{"$match":{"age":{"$gte":10}}},
{"$project":{"_id":0,"name":true,"hobby":"$interest","student":"true"}}])
6)可以将嵌套的内容取到第一级
db.basic.aggregate({"$match":{"total":{"$ne":null}}},
{"$project":{"total":true,"version":"$banner.version","url":"$banner.url"}})
find取到的依然是分级的
db.basic.find({"total":{"$ne":null}},
{"total":true,"banner.version":true,"banner.url":true})
7)如果固定字段有含有$符号,那么就要使用$literal来解决,这也算是aggregate的bug吧
db.edcation.aggregate(
[{"$match":{"age":{"$gte":10}}},
{"$project":{"_id":0,"name":true,"interest":true,"hello":{"$literal":"$world"}}}])
8)分组去重,与find的distinct还是有本质的区别的;group
db.edcation.aggregate(
        [{"$group":{"_id":"$name"}}])
min,max,avg,sum统计函数的使用
db.edcation.aggregate(
        [{"$group":{"_id":"$name"
            ,"min_age":{"$min":"$age"}
            ,"max_age":{"$max":"$age"}
            ,"sum_age":{"$sum":"$age"}
            }}])

aggregate复杂聚合查询

拆分数组

unwind,但是每次只能拆一个字段

元数据
db.getCollection('clothes').find({}).limit(2)
/* 1 */
{
  "_id" : ObjectId("6308e0edf8fcab402f1c8cae"),
  "name" : "帽子",
  "size" : [
      "L",
      "S"
  ],
  "price" : [
      300,
      100
  ]
}

/* 2 */
{
  "_id" : ObjectId("6308e0eef8fcab402f1c8caf"),
  "name" : "鞋子",
  "size" : [
      "M",
      "L"
  ],
  "price" : [
      800,
      600
  ]
}
实操
db.getCollection('clothes').aggregate(
[{"$unwind":"$size"},{"$unwind":"$price"}
])
/* 1 */
{
  "_id" : ObjectId("6308e0edf8fcab402f1c8cae"),
  "name" : "帽子",
  "size" : "L",
  "price" : 300
}

/* 2 */
{
  "_id" : ObjectId("6308e0edf8fcab402f1c8cae"),
  "name" : "帽子",
  "size" : "L",
  "price" : 100
}
注意这里的操作是限制不了展示的条数返回的

aggregate联合多个集合查询

lookup操作

db.example_user.aggregate(
[{"$lookup":{
  "from":"example_post",
  "localField":"id",
  "foreignField":"user_id",
  "as":"weibo_info"}}
]
)
其格式可以表示为
example_user集合
example_post集合
"localField":"id",example_user集合的id
"foreignField":"user_id",example_post集合的user_id
"as"联合后example_post集合嵌套在example_user集合中且名字为weibo_info,这个as是必须的操作

检验

db.example_user.aggregate(
[
{"$match":{"age":{"$gt":20}}},
{"$lookup":{
  "from":"example_post",
  "localField":"id",
  "foreignField":"user_id",
  "as":"weibo_info"},
  },
{"$unwind":"$weibo_info"},
{"$project":{"work":true,"age":true,"name":true,"content":"$weibo_info.content"}
  }
]
)
元数据

example_post

{
  "_id" : ObjectId("630966fc926011d7763697a5"),
  "user_id" : 1002,
  "content" : "考试完了,好无聊啊啊",
  "post_time" : "2018-06-11 12:23:12"
}

/* 2 */
{
  "_id" : ObjectId("630966fc926011d7763697a6"),
  "user_id" : 1003,
  "content" : "大家看我今天吃得什么[图片]",
  "post_time" : "2018-06-11 12:27:12"
}

example_user

{
  "_id" : ObjectId("630966fd926011d7763697b3"),
  "age" : 17,
  "id" : 1001,
  "name" : "王小一",
  "register_date" : "2018-06-09",
  "work" : "学生"
}

/* 2 */
{
  "_id" : ObjectId("630966fd926011d7763697b4"),
  "age" : 18,
  "id" : 1002,
  "name" : "张小二",
  "register_date" : "2018-06-09",
  "work" : "学生"
}

安全问题

安装
1、下载 https://www.mongodb.com/try/download/community
2、可以创建一下单独文件夹来解压
tar -zxvf mongodb-linux-x86_64-rhel70-4.2.5.tgz -C /usr/local/
3.在/usr/local/mongodb设置mongodb.conf
[root@VM-4-3-centos mongodb]# cat mongodb.conf
  port=27017 #端口
  bind_ip=0.0.0.0 #默认是127.0.0.1
  dbpath=/usr/local/mongodb/data #数据库存放
  logpath=/usr/local/mongodb/logs/mongodb.log #日志文件
  fork=true #设置后台运行
  auth=true #开启认证
4.配置环境变量/etc/profile
export PATH=/usr/local/mongodb/bin:$PATH
5.使配置生效
source /etc/profile
6.在mongodb的根目录下,创建如下文件
mkdir logs data
7.启动服务
mongod --config mongodb.conf
8.查看服务
[root@VM-4-3-centos mongodb]# netstat -tlpn|grep 27017
tcp       0     0 0.0.0.0:27017           0.0.0.0:*               LISTEN  
设置密码
注意密码还是要加上的,尽量还是复杂一些吧。我刚部署的项目,还没来得急上密码就被黑客搞了。很没意思
登录:
/usr/local/mongodb/bin
mongo --port 27017 -u username -p password
mongo --port 27017 将不会查到有效的消息
1)查看所有库
show dbs
2)use admin
3)db.createUser({ user: "admin", pwd: "xx", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
4)db.createUser({user: "root",pwd: "xxx", roles: [ { role: "root", db: "admin" } ]})
5)查看集合
show collections;
6)

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/282617.html

(0)
上一篇 2022年8月28日
下一篇 2022年8月28日

相关推荐

发表回复

登录后才能评论