zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    字符串与字典常用命令
    Python学习之路:字符串常用操作
    Python学习之路:购物车实例
    面试题2017
    c#语法学习
    结构化设计模式-桥接模式
    结构型设计模式-适配器模式
    .Net Cache
    设计模式的六大原则
    uml类图关系
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/12013515.html
Copyright © 2011-2022 走看看