
    Ngq                         d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
  ej        e          Z G d de
          ZdS )    N)DictListOptionalSequence)Document)
BaseLoaderc                       e Zd ZdZddddddedededee         d	eee                  d
eee                  deddfdZ	de
e         fdZde
e         fdZdee         fdZ	 ddedee         dedefdZdS )MongodbLoaderzLoad MongoDB documents.NT)filter_criteriafield_namesmetadata_names!include_db_collection_in_metadataconnection_stringdb_namecollection_namer   r   r   r   returnc                   	 ddl m} n"# t          $ r}	t          d          |	d}	~	ww xY w|st          d          |st          d          |st          d           ||          | _        || _        || _        |pg | _        |pi | _        |pg | _	        || _
        | j                            |          | _        | j                            |          | _        dS )a  
        Initializes the MongoDB loader with necessary database connection
        details and configurations.

        Args:
            connection_string (str): MongoDB connection URI.
            db_name (str):Name of the database to connect to.
            collection_name (str): Name of the collection to fetch documents from.
            filter_criteria (Optional[Dict]): MongoDB filter criteria for querying
            documents.
            field_names (Optional[Sequence[str]]): List of field names to retrieve
            from documents.
            metadata_names (Optional[Sequence[str]]): Additional metadata fields to
            extract from documents.
            include_db_collection_in_metadata (bool): Flag to include database and
            collection names in metadata.

        Raises:
            ImportError: If the motor library is not installed.
            ValueError: If any necessary argument is missing.
        r   )AsyncIOMotorClientzBCannot import from motor, please install with `pip install motor`.Nz#connection_string must be provided.zdb_name must be provided.z!collection_name must be provided.)motor.motor_asyncior   ImportError
ValueErrorclientr   r   r   r   r   r   get_databasedbget_collection
collection)
selfr   r   r   r   r   r   r   r   es
             h/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/document_loaders/mongodb.py__init__zMongodbLoader.__init__   s    @	>>>>>>> 	 	 	T 	
 ! 	DBCCC 	:8999 	B@AAA(():;;.&,".4",21R.+**733'00AAs   	 
(#(c                 N    t          j        |                                           S )a  Load data into Document objects.

        Attention:

        This implementation starts an asyncio event loop which
        will only work if running in a sync env. In an async env, it should
        fail since there is already an event loop running.

        This code should be updated to kick off the event loop from a separate
        thread if running within an async context.
        )asynciorunaload)r   s    r   loadzMongodbLoader.loadJ   s     {4::<<(((    c                   K   g }| j                             | j                   d{V }|                                 }| j                             | j        |          2 3 d{V }|                     || j        d          }| j        r"|                    | j	        | j
        d           | j        Q|                     || j        d          }d |                                D             }d                    |          }nt          |          }|                    t!          ||                     6 t#          |          |k    r.t$                              dt#          |           d	| d
           |S )z0Asynchronously loads data into Document objects.N )default)databaser   c                 ,    g | ]}t          |          S  )str).0values     r   
<listcomp>z'MongodbLoader.aload.<locals>.<listcomp>k   s    AAAUAAAr&    )page_contentmetadataz6Only partial collection of documents returned. Loaded z docs, expected .)r   count_documentsr   _construct_projectionfind_extract_fieldsr   r   updater   r   r   valuesjoinr-   appendr   lenloggerwarning)	r   result
total_docs
projectiondocr3   fieldstextstexts	            r   r$   zMongodbLoader.aloadX   s     ?::4;OPPPPPPPP
//11
--d.BJOO 	J 	J 	J 	J 	J 	J 	J#++C1Db+QQH 5 !%T=QRR  
 +--c43CR-PPAAAAAxx3xxMM(xHHHIIII# P& v;;*$$NNEf++E E7AE E E  
 s   D7c                     t          | j                  pg }t          | j                  pg }||z   }|rd |D             ndS )zuConstructs the projection dictionary for MongoDB query based
        on the specified field names and metadata names.c                     i | ]}|d S )   r,   )r.   fields     r   
<dictcomp>z7MongodbLoader._construct_projection.<locals>.<dictcomp>   s    111Uq111r&   N)listr   r   )r   r   r   
all_fieldss       r   r6   z#MongodbLoader._construct_projectionz   sW     4+,,2d1228b >1
5?I11j1111TIr&   r(   documentrD   r)   c                     i }|pg D ]U}|}|                     d          D ] }|                    ||          }||k    r n!|                    dd          }|||<   V|S )zAExtracts and returns values for specified fields from a document.r4   _)splitgetreplace)	r   rN   rD   r)   	extractedrJ   r/   keynew_field_names	            r   r8   zMongodbLoader._extract_fields   s     	\r 	. 	.EE{{3''  		#w//G##E $"]]344N(-In%%r&   )r(   )__name__
__module____qualname____doc__r-   r   r   r   boolr    r   r   r%   r$   r6   r8   r,   r&   r   r
   r
      sd       !! +//326269B 9B 9B9B 9B 	9B "$9B hsm,9B !#/9B ,09B 
9B 9B 9B 9Bv)d8n ) ) ) ) T(^        DJx~ J J J J 	   	
 
     r&   r
   )r"   loggingtypingr   r   r   r   langchain_core.documentsr   )langchain_community.document_loaders.baser   	getLoggerrW   r>   r
   r,   r&   r   <module>ra      s      1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - @ @ @ @ @ @		8	$	$F F F F FJ F F F F Fr&   