U
    h                     @   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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dS )MongodbLoaderzLoad MongoDB documents.N)filter_criteriafield_names)connection_stringdb_namecollection_namer	   r
   returnc             
   C   s   zddl m} W n, tk
r< } ztd|W 5 d }~X Y nX |sJtd|sVtd|sbtd||| _|| _|| _|| _|pi | _| j	|| _
| j
|| _d S )Nr   )AsyncIOMotorClientzBCannot import from motor, please install with `pip install motor`.z#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	   Zget_databasedbZget_collection
collection)selfr   r   r   r	   r
   r   e r   P/tmp/pip-unpacked-wheel-9gdii04g/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   load0   s    zMongodbLoader.loadc                    s  g }| j | jI dH }| jr.dd | jD nd}| j | j|2 z3 dH W }| j| jd}| jdk	ri }| jD ]>}|d}|}	|D ]}
|
|	kr|	|
 }	qd}	 qq|	||< qpdd | D }d		|}nt
|}|t||d
 qB6 t||krtdt| d| d |S )z Load data into Document objects.Nc                 S   s   i | ]
}|d qS )   r   ).0fieldr   r   r   
<dictcomp>E   s      z'MongodbLoader.aload.<locals>.<dictcomp>)Zdatabaser   . c                 S   s   g | ]}t |qS r   )str)r   valuer   r   r   
<listcomp>]   s     z'MongodbLoader.aload.<locals>.<listcomp> )Zpage_contentmetadataz6Only partial collection of documents returned. Loaded z docs, expected )r   Zcount_documentsr	   r
   findr   r   splitvaluesjoinr$   appendr   lenloggerwarning)r   resultZ
total_docsZ
projectiondocr(   fieldsnamekeysr%   keyZtextstextr   r   r   r   >   s8    




zMongodbLoader.aload)__name__
__module____qualname____doc__r$   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
!r   )r   loggingtypingr   r   r   r   Zlangchain_core.documentsr   Z)langchain_community.document_loaders.baser   	getLoggerr8   r/   r   r   r   r   r   <module>   s   
