MongoDB多集合排序的一种实现

需求

假设有三个类型有所不同的表,saleorders、careorders、repairorders,表中有storeId信息,用于关联其所属的门店stores表,现在有个需求是要将这三个表集中展示在一个表格中展示。

实现

以下驱动使用mongoose实现,MongoDB版本大于3.6。


var orders = Store.aggregate([
    {
        $match: {_id: storeId},
    },
    {
        $lookup: {
            from: "saleorders",
            let: {
                storeId: storeId,
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ['$storeId', '$$storeId'],
                        }
                    }
                }
            ],
            as:'sales'
        }
    },
    {
        $lookup: {
            from: "careorders",
            let: {
                storeId: storeId
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ['$storeId', '$$storeId']
                        }
                    }
                }
            
            ],
            as: 'cares'
        }
    },
    {
        $lookup: {
            from: "repairorders",
            let: {
                storeId: storeId
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ['$storeId', '$$storeId']
                        }
                    }
                }
            
            ],
            as: 'repairs'
        }
    },
    {
        $addFields: {
            "repairs.orderType": '1',
            "sales.orderType": '2',
            "cares.orderType": '3',
        }
    },
    {
        $project: {
            _id: 0,
            items: {
                $concatArrays: ['$repairs', '$cares', '$sales']
            }
        }
    },
    {$unwind: '$items'},
    {
        $replaceRoot: {
            newRoot: '$items'
        }
    },
    {$sort: {_id: -1 }},
])

这种实现的重点是使用一个排序集合之外的文档来关联这三个集合以及使用操作符$concatArrays来组合多个数组。常规的思路是,你要哪几个集合,就用那些集合进行关联,然后$unwind操作,但这种操作无法实现预期目的,因为$lookup是对每个文档进行对外关联。上述写法的思路是,假设几个集合的文档都集中在一个文档中的三个字段上,那么我们可以在单个集合上对数组合并排序。当然,前提第一步必须能找到一定会存在的唯一文档来实现关联,否则下面的步骤要不就关联不了,要不就关联多次,鉴于上面的操作是针对单个storeId的,所以必然能从stores集合中找到唯一的store文档进行关联。

当然,现实情况应该尽量避免这种方式来设计集合, 对于类型相似的文档应该放在同一个集合中,而且这种查询方式很可能出现聚合的中间步骤产生的数据量超过MongoDB限制(默认100M)的问题,应当使用allowDiskUse: true设置。

转载于:https://www.cnblogs.com/zhangjpn/p/9663703.html

### MongoDB 中固定集合 (Capped Collection) 的详解 #### 1. 固定集合的概念 固定集合(Capped Collection)是 MongoDB 提供的一种特殊类型的集合,它具有固定的大小和先进先出(FIFO)的行为模式。一旦达到其预定义的大小限制,最早的文档会被自动删除以腾出空间给新插入的数据[^1]。 #### 2. 主要特性 - **固定大小**:在创建时需指定最大磁盘占用字节数 `size` 和可选的最大文档数量 `max`。当集合中的数据量超过设定值时,旧数据会按照 FIFO 原则被移除。 - **高效插入操作**:由于内部实现类似于环形缓冲区结构,写入性能非常高,适合高频率的日志记录或实时监控场景。 - **顺序读取支持**:提供天然的时间序列排序功能,在查询时不需额外索引来保持插入顺序。 - **不可更新/扩展单条记录**:如果尝试修改现有文档使其超出原始分配的空间,则该次更新失败并抛异常;因此建议设计阶段充分考虑字段长度变化可能性。 #### 3. 使用场景分析 基于以上特点,以下是几个典型的应用领域: - 日志管理:用于保存应用程序产生的各种事件日志或者错误报告等短生命周期的信息; - 缓存机制:作为临时存储区域来加速频繁访问的小型对象检索过程; - 时间序列数据库模拟:可以用来构建简单的物联网传感器数值采集平台或者其他需要按时间维度组织大量同质化样本点的地方。 #### 4. 创建方法演示 下面展示如何通过 Python 驱动程序 pymongo 来声明一个新的 capped collection: ```python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client['test_database'] # Create a new capped collection named 'log_messages' with maximum storage of 5MB and up to 10k entries. result = db.create_collection( "log_messages", capped=True, size=5 * 1024 * 1024, # Size limit in bytes max=10000 # Optional document count cap ) print(f"Capped collection created successfully? {bool(result)}") ``` 此脚本片段展示了怎样利用 PyMongo 库连接本地实例上的测试数据库,并初始化名为 log_messages 的受容量约束的新表单[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值