使用pymongo操作mongodb普通查询以及嵌套查询+django中配置mongodb

287 阅读3分钟

一、 在django中配置mongodb

1、修改配置文件settings .py

找到settings.py中的DATABASE字段如下

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   
        'NAME': 'test',                 
        'USER': 'root',                       
        'PASSWORD': 'root',                     
        'HOST': 'localhost',                    
        'PORT': '3306',                        
    },
    'mongotest': {
        'ENGINE': None,
    }
}

import mongoengine
# 连接mongodb中数据库
conn = mongoengine.connect("test")

上述配置是同事配置了mysql与mongodb,通过第三方库 mongoengine提供与mongodb的连接

2、编写models.py配置mongodb中的collection

接下来定义models.py中的模型,写入我们的数据库。 这里我定义了6个字段,四个为字符串类型,一个为布尔类型,一个为字典类型。

from django.db import models
import mongoengine

# Create your models here.
class UserModel(mongoengine.Document):
    username = mongoengine.StringField(max_length=16)
    password= mongoengine.StringField(max_length=16)
    phone= mongoengine.StringField(max_length=16)
    email= mongoengine.StringField(max_length=16)
    authority=mongoengine.BooleanField(default=False)#会员权限
    dataset=mongoengine.DictField()

这里说一下字典类型datset。顾名思义,这是用来存放用户上传的数据集的,因此需要通过一个嵌套的字典进行存储。建立数据集名称-数据集的key-value结构,value的数据集也需要通过一个字典进行保存。

3、在django中对mongodb的数据进行增删改查

接下来写一个增删改查的示例

import pandas as pd
df=pd.read_csv("Datasets/hour.csv")
#将pandas读取的dataframe转换为字典
data = {i: df[i].tolist() for i in df.columns}
#如果没有数据集,也可以用以下内容作为插入
#data={"Mon":1;"Tue":2;"Wed":3}

#新增数据
 UserModel.objects.create(
    username='admin',
    password='admin',
    phone='123456',
    email='123456',
    authority=True,
    dataset={"hour":data}
    )
    
 #查询数据
 user=UserModel.objects.filter(username=username)
 #更新数据
 UserModel.objects.filter(username=username).update(password='123',phone='456')
 #删除数据
 UserModel.objects.filter(username=username).delete()


二、使用pymongo 进行数据的增删改查

1、基本的增删改查

个人觉得在django中,使用pymongo进行增删改查的操作会相对而言有更好的体验

导入pymongo并选择要操作的集合 数据库和集合也会自动创建

from pymongo import MongoClient
host='localhost'
port='27017'
client = MongoClient(host,port)
collection = client['db名']['集合名']
  • 添加一条数据
add = collection.insert_one({"name":"test10010","age":33})
  • 添加多条数据
item_list = [{"name":"test1000{}".format(i)} for i in range(10)]
 #insert_many接收一个列表,列表中为所有需要插入的字典
 t = collection.insert_many(item_list)
  • 查找一条数据
#find_one查找并且返回一个结果,接收一个字典形式的条件
 t = collection.find_one({"name":"test10005"})
  • 查找全部数据 结果返回一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,但是只能够进行一次读取
#find返回所有满足条件的结果,如果条件为空,则返回数据库的所有
t = collection.find({"name":"test10005"})
    #结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,
for i in t:
    print(i)
for i in t: #此时t中没有内容
    print(i)
  • 更新以及删除数据 更新数据时 注意使用$set命令
#update_one更新一条数据
 collection.update_one({"name":"test10005"},{"$set":{"name":"new_test10005"}})
 
#update_all更新全部数据
 collection.update_many({"name":"test10005"},{"$set":{"name":"new_test10005"}})

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

#delete_may删除所有满足条件的数据
 collection.delete_many({"name":"test10010"})

2、对嵌套文档的增删改查

参考连接: blog.csdn.net/frightingfo…

我们在一开始增加数据的时候有定义一个DictField字段,那么如果我们要对这个嵌套文档进行增删改查呢。这里要用到几个修改器:$push,$pop,$pull。 关于这个字段,要注意的是auther需要是一个数组,否则在进行push操作时会出现报错.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MvpqChDg-1597905698084)(en-resource://database/516:1)]

首先增加一个name: db.myFirstCollection.update({_id:1},{"$push":{"auther":{"name":1}}}) 删除最后一个值,若要删除第一个值则为-1 db.myFirstCollection.update({_id:1},{"$pop":{"auther":1}}) 删除指定值 db.myFirstCollection.update({_id:1},{"$pull":{"auther":{"name":1}}}) 如果要给auther中第一个值加一个age字段 db.myFirstCollection.update({"_id" :1},{"$set":{"auther.0.age":22}})

三、更多

更多实际内容以及代码示例可以关注以下公众号。 在这里插入图片描述