Example #1
0
    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)
Example #2
0
    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)