U
    hy!                     @   sh   d dl mZmZmZmZmZ d dlmZ d dlm	Z	 G dd de	e
ef ZG dd de	e
ef ZdS )	    )IteratorListOptionalSequenceTupleDocument)	BaseStorec                   @   s   e Zd ZdZddeeeee ddddZee e	ee
  ddd	Zeeee
f  dd
ddZee ddddZdee ee dddZdS )MongoDBByteStorea  BaseStore implementation using MongoDB as the underlying store.

    Examples:
        Create a MongoDBByteStore instance and perform operations on it:

        .. code-block:: python

            # Instantiate the MongoDBByteStore with a MongoDB connection
            from langchain.storage import MongoDBByteStore

            mongo_conn_str = "mongodb://localhost:27017/"
            mongodb_store = MongoDBBytesStore(mongo_conn_str, db_name="test-db",
                                         collection_name="test-collection")

            # Set values for keys
            mongodb_store.mset([("key1", "hello"), ("key2", "workd")])

            # Get values for keys
            values = mongodb_store.mget(["key1", "key2"])
            # [bytes1, bytes1]

            # Iterate over keys
            for key in mongodb_store.yield_keys():
                print(key)

            # Delete keys
            mongodb_store.mdelete(["key1", "key2"])
    Nclient_kwargsconnection_stringdb_namecollection_namer   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||f|pni | _| j| | | _dS aE  Initialize the MongoDBStore with a MongoDB connection string.

        Args:
            connection_string (str): MongoDB connection string
            db_name (str): name to use
            collection_name (str): collection name to use
            client_kwargs (dict): Keyword arguments to pass to the Mongo client
        r   )MongoClientzRThe MongoDBStore requires the pymongo library to be installed. pip install pymongoNz#connection_string must be provided.zdb_name must be provided.z!collection_name must be provided.pymongor   ImportError
ValueErrorclient
collectionselfr   r   r   r   r   e r   G/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/storage/mongodb.py__init__%   s(    zMongoDBByteStore.__init__keysr   c                    s4   | j dd|ii}dd |D   fdd|D S )z  Get the list of documents associated with the given keys.

        Args:
            keys (list[str]): A list of keys representing Document IDs..

        Returns:
            list[Document]: A list of Documents corresponding to the provided
                keys, where each Document is either retrieved successfully or
                represented as None if not found.
        _id$inc                 S   s   i | ]}|d  |d qS r#   valuer   .0docr   r   r   
<dictcomp>V   s      z)MongoDBByteStore.mget.<locals>.<dictcomp>c                    s   g | ]}  |qS r   getr(   keyZresult_dictr   r   
<listcomp>W   s     z)MongoDBByteStore.mget.<locals>.<listcomp>r   findr   r!   resultr   r/   r   mgetJ   s    zMongoDBByteStore.mgetkey_value_pairsr   c                    s8   ddl m  dd |D }| j fdd|D  dS )zSet the given key-value pairs.

        Args:
            key_value_pairs (list[tuple[str, Document]]): A list of id-document
                pairs.
        r   	UpdateOnec                 S   s   g | ]\}}||d qS r%   r   r(   kvr   r   r   r0   b   s     z)MongoDBByteStore.mset.<locals>.<listcomp>c                    s&   g | ]} d |d  id|iddqS r#   z$setT)Zupsertr   r(   ur8   r   r   r0   d   s     Nr   r9   r   Z
bulk_writer   r7   Zupdatesr   r8   r   msetY   s
    zMongoDBByteStore.msetc                 C   s   | j dd|ii dS zvDelete the given ids.

        Args:
            keys (list[str]): A list of keys representing Document IDs..
        r#   r$   Nr   Zdelete_manyr   r!   r   r   r   mdeleteg   s    zMongoDBByteStore.mdeleteprefixr   c                 c   s^   |dkr*| j jdgdD ]}|d V  qn0| j jddd| iidgdD ]}|d V  qJdS zfYield keys in the store.

        Args:
            prefix (str): prefix of keys to retrieve.
        Nr#   )Z
projectionz$regex^r1   r   rI   r)   r   r   r   
yield_keyso   s     
zMongoDBByteStore.yield_keys)N)__name__
__module____qualname____doc__strr   dictr   r   r   bytesr5   r   rC   rG   r   rM   r   r   r   r   r
      s   #%r
   c                   @   s   e Zd ZdZddeeeee ddddZee e	ee
  ddd	Zeeee
f  dd
ddZee ddddZdee ee dddZdS )MongoDBStorea  BaseStore implementation using MongoDB as the underlying store.

    Examples:
        Create a MongoDBStore instance and perform operations on it:

        .. code-block:: python

            # Instantiate the MongoDBStore with a MongoDB connection
            from langchain.storage import MongoDBStore

            mongo_conn_str = "mongodb://localhost:27017/"
            mongodb_store = MongoDBStore(mongo_conn_str, db_name="test-db",
                                         collection_name="test-collection")

            # Set values for keys
            doc1 = Document(...)
            doc2 = Document(...)
            mongodb_store.mset([("key1", doc1), ("key2", doc2)])

            # Get values for keys
            values = mongodb_store.mget(["key1", "key2"])
            # [doc1, doc2]

            # Iterate over keys
            for key in mongodb_store.yield_keys():
                print(key)

            # Delete keys
            mongodb_store.mdelete(["key1", "key2"])
    Nr   r   c             
   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||f|pni | _| j| | | _dS r   r   r   r   r   r   r      s(    zMongoDBStore.__init__r    c                    s4   | j dd|ii}dd |D   fdd|D S )r"   r#   r$   c                 S   s    i | ]}|d  t f |d qS r%   r   r'   r   r   r   r*      s      z%MongoDBStore.mget.<locals>.<dictcomp>c                    s   g | ]}  |qS r   r+   r-   r/   r   r   r0      s     z%MongoDBStore.mget.<locals>.<listcomp>r1   r3   r   r/   r   r5      s    zMongoDBStore.mgetr6   c                    s8   ddl m  dd |D }| j fdd|D  dS )zSet the given key-value pairs.

        Args:
            key_value_pairs (list[tuple[str, Document]]): A list of id-document
                pairs.
        Returns:
            None
        r   r8   c                 S   s   g | ]\}}||j d qS r:   )__dict__r;   r   r   r   r0      s     z%MongoDBStore.mset.<locals>.<listcomp>c                    s&   g | ]} d |d  id|iddqS r>   r   r?   r8   r   r   r0      s     NrA   rB   r   r8   r   rC      s
    	zMongoDBStore.msetc                 C   s   | j dd|ii dS rD   rE   rF   r   r   r   rG      s    zMongoDBStore.mdeleterH   c                 c   s^   |dkr*| j jdgdD ]}|d V  qn0| j jddd| iidgdD ]}|d V  qJdS rJ   r1   rL   r   r   r   rM      s     
zMongoDBStore.yield_keys)N)rN   rO   rP   rQ   rR   r   rS   r   r   r   r   r5   r   rC   rG   r   rM   r   r   r   r   rU      s   %%rU   N)typingr   r   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.storesr	   rR   rT   r
   rU   r   r   r   r   <module>   s   x