mongodb聚合检索与分布检索效果对比

##目标实现:mongo_doc_table与mongo_table为关联表,分别以_id与documentId作为关联信息,现在需要从mongo_doc_table中获取upStatus为1获空条件下的_id,用于mongo_table中完成相关检索任务。
###思路一:
基本方法:先查mongo_doc_table再查mongo_table,利用两表之间的关联信息

		mong_doc_col = db[mong_doc_name]
		doc_condition = {}

        if file_id_list:
            doc_condition["_id"] = {"$in": file_id_list}
        if class_id_list:
            doc_condition["classificationId"] = {"$in": class_id_list}

        # 添加 upStatus 为 1 或空的限制条件
        doc_condition["upStatus"] = {"$in": [1, None]}
        # 查询 mong_doc_name 表,获取符合条件的 documentId
        doc_results = mong_doc_col.find(doc_condition, {"_id": 1})
        document_id_list = [doc["_id"] for doc in doc_results]
        # 如果没有符合条件的 documentId,直接返回空结果,添加下方限制条件
        if not document_id_list:
            condition = {"vectorStatus": 1, "lineVector": {"$exists": True, "$nin": ["", None]},
                         "lineType": {"$in": [1, 2, 3]},
                         "paragraphStyle": {"$in": ["PARAGRAPH", "PICTURE", "TABLE", None]}}
        else:
            condition = {"documentId": {"$in": document_id_list}, "vectorStatus": 1,
                         "lineVector": {"$exists": True, "$nin": ["", None]},
                         "lineType": {"$in": [1, 2, 3]}, "paragraphStyle": {"$in": ["PARAGRAPH", "PICTURE", "TABLE", None]}}

        # 只返回指定字段
        projection = {"lineVector": 1, "_id": 1}
        results = line_info_col.find(condition, projection)

###思路一:利用聚合查询

        mong_doc_col = db[mong_doc_name]
        # 构建聚合管道
        pipeline = []
        # 第1步:从 mong_doc_name 表中筛选符合条件的 _id
        match_stage = {}
        if file_id_list:
            match_stage["_id"] = {"$in": file_id_list}
        if class_id_list:
            match_stage["classificationId"] = {"$in": class_id_list}
        matchCondition = {
            **match_stage,
            "$or": [
                {"upStatus": 1},
                {"upStatus": None}
            ]
        }
        pipeline.append({"$match": matchCondition})
        project_stage_doc = {
            "_id": 1,
            "upStatus": 1
        }
        pipeline.append({"$project": project_stage_doc})
        # 第3步:将 mong_doc_name 表的 _id 与 collection_name 表的 documentId 关联
        lookup_stage = {
            "$lookup": {
                "from": collection_name,  # <collection to join>
                "localField": "_id",  #<field from the input documents>
                "foreignField": "documentId",  # <field from the documents of the "from" collection>
                "as": "document_details"  # 关联结果
            }
        }
        pipeline.append(lookup_stage)
        # 第3步:展开关联结果
        pipeline.append({"$unwind": "$document_details"})
        # 第4步:筛选 collection_name 表中符合条件的文档
        match_stage_2 = {
            "document_details.vectorStatus": 1,
            "document_details.lineVector": {"$exists": True, "$nin": ["", None]},
            "document_details.lineType": {"$in": [1, 2, 3]},
            "document_details.paragraphStyle": {"$in": ["PARAGRAPH", "PICTURE", "TABLE", None]}
        }
        pipeline.append({"$match": match_stage_2})

        # 第5步:只返回需要的字段(lineVector)
        project_stage = {
            "_id": "$document_details._id",
            "lineVector": "$document_details.lineVector"
        }
        pipeline.append({"$project": project_stage})
        # 执行聚合查询
        results = mong_doc_col.aggregate(pipeline)

注意:mongo查询语句中 null 与python代码中 None 相对应。
同样数据量下,猜测一下速率问题?
基本方法快于聚合查询!些许疑惑?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值