一: 數據結構
{ "_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'>
不想顯示_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'>
根據列表里面的字段進行查詢
只想顯示 "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'>
但是不想顯示_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
情況二:不唯一值字段 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'>
修改數據結構為
{ "_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