python pymongo使用mongodb入门

本文介绍了如何使用Python的pymongo库连接和操作MongoDB数据库,包括安装、连接、创建/获取数据库、创建/获取集合、新增、查询、批量插入、统计、组合查询、创建索引等关键步骤,并提供了完整的示例代码。

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

python 使用mongodb是通过pymongo进行操作的

安装:
pip install pymongo
连接
client = MongoClient('mongodb://localhost:27017/')
创建db或连接db
client.test_database
client['test-database']
db = client.get_database("db_name")

认证:

db.authenticate('username', 'password')
创建集合collection 或获取集合
db.test_collection
db['test-collection']
查看集合
db.list_collection_names()
新增
init_data = {"author": "tom", "text": "My first blog post!",
             "tags": ["mongodb", "python", "pymongo"],
             "date": datetime.datetime.utcnow()}

post_id = collection.insert_one(init_data).inserted_id

print post_id
查询单文档

可以根据条件进行查询, 也可以使用projectid进行查询,注意: project不是简单的str字符串

print collection.find_one({"_id": post_id})

print collection.find_one({"author": "Mike"})

使用projectid查询

from bson.objectid import ObjectId


def get(post_id):
    # Convert from string to ObjectId:
    document = client.db.collection.find_one({'_id':ObjectId(post_id)})

print collection.find_one({"_id": ObjectId("xkkwow1919")})

批量插入:
muilt_data = [{"author": "Mike",
               "text": "Another post!",
               "tags": ["bulk", "insert"],
               "date": datetime.datetime(2009, 11, 12, 11, 14)},
              {"author": "Eliot",
               "title": "MongoDB is fun",
               "text": "and pretty easy too!",
               "date": datetime.datetime(2009, 11, 10, 10, 45)}]


result = collection.insert_many(muilt_data)

print result.inserted_ids
查询多个文档
collection_data = collection.find()

for _data in collection_data:
    print _data
统计
count = collection.count_documents({})
print count
T_count = collection.count_documents({"author": "tom"})
print T_count
组合查询
d = datetime.datetime(2009, 11, 12, 12)
for post in collection.find({"date": {"$lt": d}}).sort("author"):
    print post

排序:

collection.find().sort("name", pymongo.ASCENDING)
collection.find().sort([("name", pymongo.ASCENDING), ("active_time", pymongo.DESCENDING)])
创建索引
ind_res = result = db.profiles.create_index([('user_id', pymongo.ASCENDING)], unique=True)
print list(db.profiles.index_information())

唯一性索引

user_profiles = [{'user_id': 211, 'name': 'Luke'},  {'user_id': 212, 'name': 'Ziltoid'}]

db.profiles.insert_many(user_profiles)

duplicate_profile = {'user_id': 212, 'name': 'Tommy'}

try:
    db.profiles.insert_one(duplicate_profile)
except:
    print traceback.format_exc()

完整示例代码:

# coding: utf-8

import traceback
import datetime
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId

client = pymongo.MongoClient("mongodb://127.0.0.1:12701/")

db = client.mytest

collection = db['test-collection']

#新建collection 并插入文档

init_data = {"author": "tom", "text": "My first blog post!",
             "tags": ["mongodb", "python", "pymongo"],
             "date": datetime.datetime.utcnow()}

post_id = collection.insert_one(init_data).inserted_id

print post_id

# 查看collection是否创建
print db.list_collection_names()
print collection.find_one({"_id": post_id})

print collection.find_one({"_id": ObjectId("xkkwow1919")})

# 查找 collection
print collection.find({"author": "Mike"})
print collection.find_one({"author": "Mike"})


# 插入多个多个文档
muilt_data = [{"author": "Mike",
               "text": "Another post!",
               "tags": ["bulk", "insert"],
               "date": datetime.datetime(2009, 11, 12, 11, 14)},
              {"author": "Eliot",
               "title": "MongoDB is fun",
               "text": "and pretty easy too!",
               "date": datetime.datetime(2009, 11, 10, 10, 45)}]


result = collection.insert_many(muilt_data)

print result.inserted_ids


# 查找多个文档
# 返回cusor
collection_data = collection.find()

for _data in collection_data:
    print _data


# 统计

count = collection.count_documents({})
print count
T_count = collection.count_documents({"author": "tom"})
print T_count


# 组合查询

d = datetime.datetime(2009, 11, 12, 12)
for post in collection.find({"date": {"$lt": d}}).sort("author"):
    print post


# 创建索引

ind_res = result = db.profiles.create_index([('user_id', pymongo.ASCENDING)], unique=True)
print list(db.profiles.index_information())


user_profiles = [{'user_id': 211, 'name': 'Luke'},  {'user_id': 212, 'name': 'Ziltoid'}]

db.profiles.insert_many(user_profiles)

duplicate_profile = {'user_id': 212, 'name': 'Tommy'}

try:
    db.profiles.insert_one(duplicate_profile)
except:
    print traceback.format_exc()


输出:

[u'test-collection', u'profiles', u'people']
<pymongo.cursor.Cursor object at 0x03C75810>
{u'date': datetime.datetime(2019, 7, 31, 8, 20, 42, 595000), u'text': u'My first blog post!', u'_id': ObjectId('5d414f5ac4decf11266bc71c'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
[ObjectId('5d415f266d4b03250b852ba0'), ObjectId('5d415f266d4b03250b852ba1')]
....
ObjectId('5d415ee96e9053b3e893f0d4'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('5d415ef48ece310693da7c23'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

.....
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('5d415ef48ece310693da7c24'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
....
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('5d415f266d4b03250b852ba0'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('5d415f266d4b03250b852ba1'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
12
0
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('5d415ec586f95fede51f2605'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('5d415f266d4b03250b852ba0'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
[u'user_id_1', u'_id_']
Traceback (most recent call last):
  File "", line 87, in <module>
    db.profiles.insert_one(duplicate_profile)
  File "C:\Python27\lib\site-packages\pymongo\collection.py", line 700, in insert_one
    session=session),
  File "C:\Python27\lib\site-packages\pymongo\collection.py", line 614, in _insert
    bypass_doc_val, session)
  File "C:\Python27\lib\site-packages\pymongo\collection.py", line 602, in _insert_one
    acknowledged, _insert_command, session)
  File "C:\Python27\lib\site-packages\pymongo\mongo_client.py", line 1280, in _retryable_write
    return self._retry_with_session(retryable, func, s, None)
  File "C:\Python27\lib\site-packages\pymongo\mongo_client.py", line 1233, in _retry_with_session
    return func(session, sock_info, retryable)
  File "C:\Python27\lib\site-packages\pymongo\collection.py", line 599, in _insert_command
    _check_write_command_response(result)
  File "C:\Python27\lib\site-packages\pymongo\helpers.py", line 217, in _check_write_command_response
    _raise_last_write_error(write_errors)
  File "C:\Python27\lib\site-packages\pymongo\helpers.py", line 198, in _raise_last_write_error
    raise DuplicateKeyError(error.get("errmsg"), 11000, error)
DuplicateKeyError: E11000 duplicate key error collection: mytest.profiles index: user_id_1 dup key: { : 212 }


封装示例:

# coding: utf-8

import pymongo
from bson.objectid import ObjectId


class MongoDB(object):
    def __init__(self, ip, port, database):
        self.client = pymongo.MongoClient("mongodb://%s:%s/" %(ip, port))
        self.database = self.client[database]

    def get_table(self, table_name):
        return self.database[table_name]
    
    def get(self, tablename, filters=None):
        result = []
        filters = filters or {}
        collection_data = self.get_table(tablename).find(filters)
        for _data in collection_data:
            result.append(_data)
        
        return result
    
    def get_one(self, tablename, filters=None):
        filters = filters or {}
        return self.get_table(tablename).find_one(filters)
    
    def get_by_id(self, tablename, tid):
        return self.get_table(tablename).find_one({"_id": ObjectId(tid)})
    
    
    def create(self, tablename, data):
        post_id = self.get_table(tablename).insert_one(data)
        tid = post_id.inserted_id
        return tid
    
    def create_many(self, tablename, datas):
        result = self.get_table(tablename).insert_many(datas)
        return result.inserted_ids
    
    
    def count(self, tablename, fileters=None):
        fileters = fileters or {}
        T_count = self.get_table(tablename).count_documents(fileters)
        return T_count
    
    
    def create_index(self, tablename, index_col, unique=False):
        '''
        :param tablename: 
        :param index_col: [('user_id', pymongo.ASCENDING)]
        :param unique: 
        :return: 
        '''
        result = self.get_table(tablename).create_index(index_col, unique=unique)
        return result
    
    def get_index_info(self, tablename):
        return list(self.get_table(tablename).index_information())


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值