def delete_node_list(cls, user_id, node_id_list, timestamp, editor_id): delete_id_list = [] if not node_id_list: defer.returnValue(delete_id_list) all_child_id_list = [] for node_id in node_id_list: child_id_list = yield node_tree_conn.get_child_id_list(user_id, node_id) all_child_id_list.extend(child_id_list) cursor = yield cls.collection.find({'root_id': user_id, '_id': {'$in': all_child_id_list}}) history_list = [] for i in cursor: old_node_id = i.pop('_id') i.update({'timestamp': timestamp, 'node_id': old_node_id, 'change_type': NodeHistoryTypeEnum.deleted, 'editor_id': editor_id}) delete_id_list.append(old_node_id) history_list.append(i) if delete_id_list: yield NodeHistory.collection.insert(history_list) yield cls.collection.remove({'_id': {'$in': delete_id_list}}) defer.returnValue(delete_id_list)
def get_nodes(cls, user_id, node_id, level = 0): """ 如果根据level来取,确实会比较麻烦,因为本身mongodb不支持array的size的范围查询。 并且不好回溯。 想到的办法是这样的,就是在内存中保存树的骨架。 即{'node': abc', 'child': [{'node': def, 'child': [{}]]} 首先找到node,然后再通过level找到对应的node_id_list 最后再返回数据 困难点: 1. 这棵树的维护(添加节点,删除节点) 2. 超时管理 3. 内存的分布式管理,估计还是要放在redis中去,因为很可能会连接到不同的节点上去。 """ node_id_list = yield node_tree_conn.get_child_id_list(user_id, node_id, level) node_list = yield cls.collection.find({'_id': {'$in': node_id_list}}) # 对查询出来的结果按id_list排序 node_list = cls.serialize(node_list) defer.returnValue(node_list)