a
    bgq                     @   s^   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eZG dd de
ZdS )    N)DictListOptionalSequence)Document)
BaseLoaderc                
   @   s   e Zd ZdZdddddeeeee eee  eee  eddddZ	e
e dd	d
Ze
e dddZee dddZdeee eedd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          
   
   C   s   zddl m} W n. ty> }	 ztd|	W Y d}	~	n
d}	~	0 0 |sLtd|sXtd|sdtd||| _|| _|| _|pg | _|pi | _|pg | _	|| _
| 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.)Zmotor.motor_asyncior   ImportError
ValueErrorclientr   r   r
   r	   r   r   Zget_databasedbZget_collection
collection)
selfr   r   r   r	   r
   r   r   r   e r   z/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/document_loaders/mongodb.py__init__   s.     



zMongodbLoader.__init__)r   c                 C   s   t |  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   r   r   r   loadJ   s    zMongodbLoader.loadc           	         s   g }| j | jI dH }|  }| j | j|2 z3 dH W }| j|| jdd}| jrh|| j	| j
d | jdur| j|| jdd}dd | D }d|}nt|}|t||d q06 t||krtd	t| d
| d |S )z0Asynchronously loads data into Document objects.N )default)Zdatabaser   c                 S   s   g | ]}t |qS r   )str).0valuer   r   r   
<listcomp>k       z'MongodbLoader.aload.<locals>.<listcomp> )Zpage_contentmetadataz6Only partial collection of documents returned. Loaded z docs, expected .)r   Zcount_documentsr	   _construct_projectionfind_extract_fieldsr   r   updater   r   r
   valuesjoinr"   appendr   lenloggerwarning)	r   resultZ
total_docsZ
projectiondocr(   fieldsZtextstextr   r   r   r   X   s0    
zMongodbLoader.aloadc                 C   s:   t | jpg }t | jpg }|| }|r6dd |D S dS )zuConstructs the projection dictionary for MongoDB query based
        on the specified field names and metadata names.c                 S   s   i | ]
}|d qS )   r   )r#   fieldr   r   r   
<dictcomp>   r&   z7MongodbLoader._construct_projection.<locals>.<dictcomp>N)listr
   r   )r   r
   r   Z
all_fieldsr   r   r   r*   z   s    z#MongodbLoader._construct_projectionr    )documentr6   r!   r   c           	      C   sV   i }|p
g D ]D}|}| dD ]}|||}||kr q<q|dd}|||< q|S )zAExtracts and returns values for specified fields from a document.r)   _)splitgetreplace)	r   r<   r6   r!   Z	extractedr9   r$   keyZnew_field_namer   r   r   r,      s    
zMongodbLoader._extract_fields)r    )__name__
__module____qualname____doc__r"   r   r   r   boolr   r   r   r   r   r*   r,   r   r   r   r   r      s2   

;" r   )r   loggingtypingr   r   r   r   Zlangchain_core.documentsr   Z)langchain_community.document_loaders.baser   	getLoggerrB   r2   r   r   r   r   r   <module>   s   
