t_pymongo.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import json
  2. from src.models.product_model import Product
  3. from src.models.config_model import UserConfig
  4. from src.models.ai_execution_record import (
  5. CompetitorKeywordAnalysis, MarketingContentGeneration, LLMConfig,
  6. AICompetitorAnalyzeMainKeywordsResult,
  7. MarketingInfo,)
  8. from src.manager.core.db_mongo import BaseMongoManager
  9. import asyncio
  10. from utils.logu import get_logger
  11. from src.models.field_config import FieldConfig, get_field_descriptions
  12. logger = get_logger('test')
  13. async def example_usage():
  14. """更新后的示例调用代码"""
  15. db_manager = BaseMongoManager(db_name='test')
  16. await db_manager.initialize()
  17. db = db_manager.db
  18. # 使用 beanie 语法
  19. product = await Product.find_one(Product.basic_info.name == "电线保护套")
  20. # 使用 pymongo 语法
  21. collection = db['Product']
  22. result = await collection.find_one(
  23. { "basic_info.name": "电线保护套" },
  24. { "basic_info": 1, "_id": 0 } # 投影
  25. )
  26. print(result)
  27. result = await db.Product.find_one(
  28. { "basic_info.name": "电线保护套" },
  29. { "basic_info": 1, "_id": 0 }
  30. )
  31. print(result)
  32. async def query_demo():
  33. """pymongo 示例调用代码"""
  34. db_manager = BaseMongoManager(db_name='test')
  35. await db_manager.initialize()
  36. db = db_manager.db
  37. query_find_one = {
  38. "filter": {"basic_info.name": "电线保护套"},
  39. "projection": {"basic_info": 1, "_id": 0}
  40. }
  41. result = await db.Product.find_one(
  42. **query_find_one
  43. )
  44. print(result)
  45. async def aggregate_demo():
  46. db_manager = BaseMongoManager(db_name='test')
  47. await db_manager.initialize()
  48. db = db_manager.db
  49. pipeline = [
  50. {
  51. '$project': {
  52. 'competitor_crawl_data': 1
  53. }
  54. }, {
  55. '$addFields': {
  56. 'competitors': {
  57. '$objectToArray': '$competitor_crawl_data'
  58. }
  59. }
  60. }, {
  61. '$unwind': '$competitors'
  62. }, {
  63. '$project': {
  64. '_id': 0,
  65. 'asin': '$competitors.k',
  66. 'product_info': {
  67. 'main_text': '$competitors.v.extra_result.product_info.main_text'
  68. },
  69. 'result_table': {
  70. '$map': {
  71. 'input': '$competitors.v.extra_result.result_table',
  72. 'as': 'item',
  73. 'in': {
  74. 'traffic_keyword': '$$item.traffic_keyword',
  75. 'monthly_searches': '$$item.monthly_searches'
  76. }
  77. }
  78. }
  79. }
  80. }
  81. ]
  82. result = await db.Product.aggregate(pipeline).to_list()
  83. print(json.dumps(result, indent=4, ensure_ascii=False))
  84. async def filter_aggregate_demo():
  85. db_manager = BaseMongoManager(db_name='test')
  86. await db_manager.initialize()
  87. db = db_manager.db
  88. filter_competior_by_name = [
  89. {
  90. '$match': {
  91. 'basic_info.name': "{{ product_name }}"
  92. }
  93. },
  94. {
  95. '$project': {
  96. 'competitor_crawl_data': 1
  97. }
  98. }, {
  99. '$addFields': {
  100. 'competitors': {
  101. '$objectToArray': '$competitor_crawl_data'
  102. }
  103. }
  104. }, {
  105. '$unwind': '$competitors'
  106. }, {
  107. '$project': {
  108. '_id': 0,
  109. 'asin': '$competitors.k',
  110. 'product_info': {
  111. 'main_text': '$competitors.v.extra_result.product_info.main_text'
  112. },
  113. 'result_table': {
  114. '$map': {
  115. 'input': '$competitors.v.extra_result.result_table',
  116. 'as': 'item',
  117. 'in': {
  118. 'traffic_keyword': '$$item.traffic_keyword',
  119. 'monthly_searches': '$$item.monthly_searches'
  120. }
  121. }
  122. }
  123. }
  124. }
  125. ]
  126. result = await db.Product.aggregate(filter_competior_by_name).to_list()
  127. print(json.dumps(result, indent=4, ensure_ascii=False))
  128. def main():
  129. asyncio.run(filter_aggregate_demo())
  130. if __name__ == "__main__":
  131. main()