pymongo操作mongo數據庫的查操作


一:  數據結構

{
    "_id" : ObjectId("5de8a5b748a75a8d48b72bdc"),
    "farm_id" : "2",
    "user_id" : "2",
    "equipment_number" : "2",
    "hybridization_detail" : [ 
        {
            "hybridization_time" : "2019-11-11",
            "pregnancy _time" : "2019-12-4",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220782"
        }, 
        {
            "hybridization_time" : "2019-11-11",
            "pregnancy _time" : "2019-12-4",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220783"
        }
    ]
}

 1. 普通查詢  查詢farm_id = 2的信息

find_one 返回的是一個字典類型的數據

from pymongo import MongoClient
import logging
lg = logging.getLogger("info")
lg.setLevel(logging.DEBUG)

class Mongodb_Wrapper(object):
    database_name = "test_function"
    collection_name = "normal"
    host = "127.0.0.1"
    port = 27017
    def __init__(self):
        self.client = MongoClient(host=self.host,port=self.port)
        self.db = self.client[self.database_name][self.collection_name]

    def find_one(self):
        ret = self.db.find_one({"farm_id":"2"})
        return ret

m = Mongodb_Wrapper()
ret = m.find_one()
print(ret)
print(type(ret))

# 結果

{'_id': ObjectId('5de8a5b748a75a8d48b72bdc'), 'farm_id': '2', 'user_id': '2', 'equipment_number': '2', 'hybridization_detail': [{'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220782'}, {'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220783'}]}
<class 'dict'>
View Code

不想顯示_id和farm_id怎么辦?可以增加第二個參數,過濾條件

 def find_one(self):
        ret = self.db.find_one({"farm_id":"2"},{"_id":0,"farm_id":0})
        return ret

結果:
{'user_id': '2', 'equipment_number': '2', 'hybridization_detail': [{'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220782'}, {'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220783'}]}
<class 'dict'>
View Code

根據列表里面的字段進行查詢

只想顯示 "id" : "15755278639220782"的這條數據怎么辦,通過限制 hybridization_detail的值進行查詢,$elemMatch進行操作

情況一:唯一值字段 id

def find_one(self):
    ret = self.db.find_one({"hybridization_detail.id":"15755278639220782"},{"hybridization_detail":{"$elemMatch":{"id":"15755278639220782"}}})
    return ret

# 結果

{'_id': ObjectId('5de8a5b748a75a8d48b72bdc'), 'hybridization_detail': [{'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220782'}]}
<class 'dict'>
View Code

但是不想顯示_id字段,增加過濾條件

def find_one(self):
    ret = self.db.find_one({"hybridization_detail.id":"15755278639220782"},{"_id":0},{"hybridization_detail":{"$elemMatch":{"id":"15755278639220782"}}})
    return ret

# 結果:TypeError: skip must be an instance of int
View Code

情況二:不唯一值字段 id以外的所有字段:只顯示匹配到的第一個字段,因此要保證數據的唯一性,就增加有唯一值的字段。

def find_one(self):
    ret = self.db.find_one({"hybridization_detail.sperm_count":"100"},{"hybridization_detail":{"$elemMatch":{"sperm_count":"100"}}})
    return ret

#結果:只顯示匹配到的第一個數據
{'_id': ObjectId('5de8a5b748a75a8d48b72bdc'), 'hybridization_detail': [{'hybridization_time': '2019-11-11', 'pregnancy _time': '2019-12-4', 'hybridization_type': '凍精', 'object_type': '奶牛', 'sperm_count': '100', 'sperm_number': '1', 'hybridization_control': '性控', 'id': '15755278639220782'}]}
<class 'dict'>
View Code

修改數據結構為

{
    "_id" : ObjectId("5de8a5b748a75a8d48b72bdc"),
    "farm_id" : "2",
    "user_id" : "2",
    "equipment_number" : "2",
    "hybridization_detail" : [ 
        {
            "hybridization_time" : "2019-11-11",
            "pregnancy _time" : "2019-12-4",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220782"
        }, 
        {
            "hybridization_time" : "2019-11-12",
            "pregnancy _time" : "2019-12-5",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220783"
        }, 
        {
            "hybridization_time" : "2019-11-13",
            "pregnancy _time" : "2019-12-6",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220783"
        }, 
        {
            "hybridization_time" : "2019-11-14",
            "pregnancy _time" : "2019-12-7",
            "hybridization_type" : "凍精",
            "object_type" : "奶牛",
            "sperm_count" : "100",
            "sperm_number" : "1",
            "hybridization_control" : "性控",
            "id" : "15755278639220783"
        }
    ]
}

查詢  "hybridization_time" 的時間從2019-11-11到2019-11-13的數據

# TODO

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM