##目标实现: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 相对应。
同样数据量下,猜测一下速率问题?
基本方法快于聚合查询!些许疑惑?