def doc(self, collection: str, oid: Union[ObjectId, str], query: Union[list, None], reference_delete=True) -> dict: """ | refもしくはembのドキュメントを取得する | オプションでedman特有のデータ含んで取得することもできる :param str collection: :param oid: :type oid: ObjectId or str :param query: :type query: list or None :param bool reference_delete: default True :return: result :rtype: dict """ oid = Utils.conv_objectid(oid) doc = self.db[collection].find_one({'_id': oid}) if doc is None: sys.exit('ドキュメントが存在しません') # embの場合は指定階層のドキュメントを引き抜く # refの場合はdocの結果をそのまま入れる doc_result = self._get_emb_doc(doc, query) if query is not None else doc # クエリの指定によってはリストデータなども取得出てしまうため if not isinstance(doc_result, dict): sys.exit(f'指定されたクエリはドキュメントではありません {query}') result = Utils.reference_item_delete( doc_result, ('_id', self.parent, self.child, self.file_ref) ) if reference_delete else doc_result return result
def recursive(data: dict): # idとrefの削除 for key, val in data.items(): if isinstance(data[key], dict): recursive(Utils.reference_item_delete(data[key], refs)) # リストデータは中身を型変換する elif isinstance(data[key], list) and Utils.item_literal_check( data[key]): data[key] = [self._format_datetime(i) for i in data[key]] elif isinstance(data[key], list): for item in data[key]: recursive(Utils.reference_item_delete(item, refs)) else: try: # 型変換 data[key] = self._format_datetime(data[key]) except Exception as e: sys.exit(e)
def test__reference_item_delete(self): # 正常系 doc = { self.parent: ObjectId(), self.child: [ObjectId(), ObjectId()], self.file: [ObjectId(), ObjectId()], 'param': 'OK' } actual = Utils.reference_item_delete( doc, ('_id', self.parent, self.child, self.file)) expected = {'param': 'OK'} self.assertDictEqual(actual, expected)