Skip to content

Firestore

FirestoreKVStore #

Bases: BaseKVStore

Firestore 键值存储。

Parameters:

Name Type Description Default
project str

客户端代表的项目。

None
database str

客户端目标的数据库名称。

DEFAULT_FIRESTORE_DATABASE
credentials Credentials

用于访问Firestore的OAuth2凭据。如果未传递,则会回退到从环境中推断出的默认凭据。

None
Source code in llama_index/storage/kvstore/firestore/base.py
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
class FirestoreKVStore(BaseKVStore):
    """Firestore 键值存储。

    Args:
        project (str): 客户端代表的项目。
        database (str): 客户端目标的数据库名称。
        credentials (google.auth.credentials.Credentials): 用于访问Firestore的OAuth2凭据。如果未传递,则会回退到从环境中推断出的默认凭据。"""

    def __init__(
        self,
        project: Optional[str] = None,
        database: str = DEFAULT_FIRESTORE_DATABASE,
        credentials: Optional[Credentials] = None,
    ) -> None:
        client_info = DEFAULT_CLIENT_INFO
        client_info.user_agent = USER_AGENT
        self._adb = AsyncClient(
            project=project,
            database=database,
            client_info=client_info,
            credentials=credentials,
        )
        self._db = Client(
            project=project,
            database=database,
            client_info=client_info,
            credentials=credentials,
        )

    def firestore_collection(self, collection: str) -> str:
        return collection.replace("/", SLASH_REPLACEMENT)

    def replace_field_name_set(self, val: Dict[str, Any]) -> Dict[str, Any]:
        val = val.copy()
        for k, v in FIELD_NAME_REPLACE_SET.items():
            if k in val:
                val[v] = val[k]
                val.pop(k)
        return val

    def replace_field_name_get(self, val: Dict[str, Any]) -> Dict[str, Any]:
        val = val.copy()
        for k, v in FIELD_NAME_REPLACE_GET.items():
            if k in val:
                val[v] = val[k]
                val.pop(k)
        return val

    def put(
        self,
        key: str,
        val: dict,
        collection: str = DEFAULT_COLLECTION,
    ) -> None:
        """将一个键值对放入Firestore集合中。

Args:
    key (str): 键
    val (dict): 值
    collection (str): 集合名称
"""
        collection_id = self.firestore_collection(collection)
        val = self.replace_field_name_set(val)
        doc = self._db.collection(collection_id).document(key)
        doc.set(val, merge=True)

    async def aput(
        self,
        key: str,
        val: dict,
        collection: str = DEFAULT_COLLECTION,
    ) -> None:
        """将一个键值对放入Firestore集合中。

Args:
    key (str): 键
    val (dict): 值
    collection (str): 集合名称
"""
        collection_id = self.firestore_collection(collection)
        val = self.replace_field_name_set(val)
        doc = self._adb.collection(collection_id).document(key)
        await doc.set(val, merge=True)

    def put_all(
        self,
        kv_pairs: List[Tuple[str, dict]],
        collection: str = DEFAULT_COLLECTION,
        batch_size: int = DEFAULT_BATCH_SIZE,
    ) -> None:
        batch = self._db.batch()
        for i, (key, val) in enumerate(kv_pairs, start=1):
            collection_id = self.firestore_collection(collection)
            val = self.replace_field_name_set(val)
            batch.set(self._db.collection(collection_id).document(key), val, merge=True)
            if i % batch_size == 0:
                batch.commit()
                batch = self._db.batch()
        batch.commit()

    async def aput_all(
        self,
        kv_pairs: List[Tuple[str, dict]],
        collection: str = DEFAULT_COLLECTION,
        batch_size: int = DEFAULT_BATCH_SIZE,
    ) -> None:
        """将键值对字典放入Firestore集合中。

Args:
    kv_pairs(List[Tuple[str, dict]]):键值对
    collection(str):集合名称
"""
        batch = self._adb.batch()
        for i, (key, val) in enumerate(kv_pairs, start=1):
            collection_id = self.firestore_collection(collection)
            doc = self._adb.collection(collection_id).document(key)
            val = self.replace_field_name_set(val)
            batch.set(doc, val, merge=True)
            if i % batch_size == 0:
                await batch.commit()
                batch = self._adb.batch()
        await batch.commit()

    def get(self, key: str, collection: str = DEFAULT_COLLECTION) -> Optional[dict]:
        """从Firestore获取键值对。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        result = self._db.collection(collection_id).document(key).get().to_dict()
        if not result:
            return None

        return self.replace_field_name_get(result)

    async def aget(
        self, key: str, collection: str = DEFAULT_COLLECTION
    ) -> Optional[dict]:
        """从Firestore获取键值对。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        result = (
            await self._adb.collection(collection_id).document(key).get()
        ).to_dict()
        if not result:
            return None

        return self.replace_field_name_get(result)

    def get_all(self, collection: str = DEFAULT_COLLECTION) -> Dict[str, dict]:
        """从Firestore集合中获取所有值。

Args:
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        docs = self._db.collection(collection_id).list_documents()
        output = {}
        for doc in docs:
            key = doc.id
            val = self.replace_field_name_get(doc.get().to_dict())
            output[key] = val
        return output

    async def aget_all(self, collection: str = DEFAULT_COLLECTION) -> Dict[str, dict]:
        """从Firestore集合中获取所有值。

Args:
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        docs = self._adb.collection(collection_id).list_documents()
        output = {}
        async for doc in docs:
            key = doc.id
            data = (await doc.get()).to_dict()
            if data is None:
                continue
            val = self.replace_field_name_get(data)
            output[key] = val
        return output

    def delete(self, key: str, collection: str = DEFAULT_COLLECTION) -> bool:
        """从Firestore中删除一个值。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        doc = self._db.collection(collection_id).document(key)
        doc.delete()
        return True

    async def adelete(self, key: str, collection: str = DEFAULT_COLLECTION) -> bool:
        """从Firestore中删除一个值。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        doc = self._adb.collection(collection_id).document(key)
        await doc.delete()
        return True

put #

put(
    key: str,
    val: dict,
    collection: str = DEFAULT_COLLECTION,
) -> None

将一个键值对放入Firestore集合中。

Parameters:

Name Type Description Default
key str

required
val dict

required
collection str

集合名称

DEFAULT_COLLECTION
Source code in llama_index/storage/kvstore/firestore/base.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    def put(
        self,
        key: str,
        val: dict,
        collection: str = DEFAULT_COLLECTION,
    ) -> None:
        """将一个键值对放入Firestore集合中。

Args:
    key (str): 键
    val (dict): 值
    collection (str): 集合名称
"""
        collection_id = self.firestore_collection(collection)
        val = self.replace_field_name_set(val)
        doc = self._db.collection(collection_id).document(key)
        doc.set(val, merge=True)

aput async #

aput(
    key: str,
    val: dict,
    collection: str = DEFAULT_COLLECTION,
) -> None

将一个键值对放入Firestore集合中。

Parameters:

Name Type Description Default
key str

required
val dict

required
collection str

集合名称

DEFAULT_COLLECTION
Source code in llama_index/storage/kvstore/firestore/base.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
    async def aput(
        self,
        key: str,
        val: dict,
        collection: str = DEFAULT_COLLECTION,
    ) -> None:
        """将一个键值对放入Firestore集合中。

Args:
    key (str): 键
    val (dict): 值
    collection (str): 集合名称
"""
        collection_id = self.firestore_collection(collection)
        val = self.replace_field_name_set(val)
        doc = self._adb.collection(collection_id).document(key)
        await doc.set(val, merge=True)

aput_all async #

aput_all(
    kv_pairs: List[Tuple[str, dict]],
    collection: str = DEFAULT_COLLECTION,
    batch_size: int = DEFAULT_BATCH_SIZE,
) -> None

将键值对字典放入Firestore集合中。

Source code in llama_index/storage/kvstore/firestore/base.py
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    async def aput_all(
        self,
        kv_pairs: List[Tuple[str, dict]],
        collection: str = DEFAULT_COLLECTION,
        batch_size: int = DEFAULT_BATCH_SIZE,
    ) -> None:
        """将键值对字典放入Firestore集合中。

Args:
    kv_pairs(List[Tuple[str, dict]]):键值对
    collection(str):集合名称
"""
        batch = self._adb.batch()
        for i, (key, val) in enumerate(kv_pairs, start=1):
            collection_id = self.firestore_collection(collection)
            doc = self._adb.collection(collection_id).document(key)
            val = self.replace_field_name_set(val)
            batch.set(doc, val, merge=True)
            if i % batch_size == 0:
                await batch.commit()
                batch = self._adb.batch()
        await batch.commit()

get #

get(
    key: str, collection: str = DEFAULT_COLLECTION
) -> Optional[dict]

从Firestore获取键值对。

Source code in llama_index/storage/kvstore/firestore/base.py
148
149
150
151
152
153
154
155
156
157
158
159
160
    def get(self, key: str, collection: str = DEFAULT_COLLECTION) -> Optional[dict]:
        """从Firestore获取键值对。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        result = self._db.collection(collection_id).document(key).get().to_dict()
        if not result:
            return None

        return self.replace_field_name_get(result)

aget async #

aget(
    key: str, collection: str = DEFAULT_COLLECTION
) -> Optional[dict]

从Firestore获取键值对。

Source code in llama_index/storage/kvstore/firestore/base.py
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
    async def aget(
        self, key: str, collection: str = DEFAULT_COLLECTION
    ) -> Optional[dict]:
        """从Firestore获取键值对。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        result = (
            await self._adb.collection(collection_id).document(key).get()
        ).to_dict()
        if not result:
            return None

        return self.replace_field_name_get(result)

get_all #

get_all(
    collection: str = DEFAULT_COLLECTION,
) -> Dict[str, dict]

从Firestore集合中获取所有值。

Source code in llama_index/storage/kvstore/firestore/base.py
180
181
182
183
184
185
186
187
188
189
190
191
192
193
    def get_all(self, collection: str = DEFAULT_COLLECTION) -> Dict[str, dict]:
        """从Firestore集合中获取所有值。

Args:
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        docs = self._db.collection(collection_id).list_documents()
        output = {}
        for doc in docs:
            key = doc.id
            val = self.replace_field_name_get(doc.get().to_dict())
            output[key] = val
        return output

aget_all async #

aget_all(
    collection: str = DEFAULT_COLLECTION,
) -> Dict[str, dict]

从Firestore集合中获取所有值。

Source code in llama_index/storage/kvstore/firestore/base.py
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
    async def aget_all(self, collection: str = DEFAULT_COLLECTION) -> Dict[str, dict]:
        """从Firestore集合中获取所有值。

Args:
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        docs = self._adb.collection(collection_id).list_documents()
        output = {}
        async for doc in docs:
            key = doc.id
            data = (await doc.get()).to_dict()
            if data is None:
                continue
            val = self.replace_field_name_get(data)
            output[key] = val
        return output

delete #

delete(
    key: str, collection: str = DEFAULT_COLLECTION
) -> bool

从Firestore中删除一个值。

Source code in llama_index/storage/kvstore/firestore/base.py
213
214
215
216
217
218
219
220
221
222
223
    def delete(self, key: str, collection: str = DEFAULT_COLLECTION) -> bool:
        """从Firestore中删除一个值。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        doc = self._db.collection(collection_id).document(key)
        doc.delete()
        return True

adelete async #

adelete(
    key: str, collection: str = DEFAULT_COLLECTION
) -> bool

从Firestore中删除一个值。

Source code in llama_index/storage/kvstore/firestore/base.py
225
226
227
228
229
230
231
232
233
234
235
    async def adelete(self, key: str, collection: str = DEFAULT_COLLECTION) -> bool:
        """从Firestore中删除一个值。

Args:
    key(str):键
    collection(str):集合名称
"""
        collection_id = self.firestore_collection(collection)
        doc = self._adb.collection(collection_id).document(key)
        await doc.delete()
        return True