MongoDB是否支持不依赖集合的操作?
MongoDB是否支持不依赖集合的操作?
当然可以啦!MongoDB 从4.4版本开始就支持不依赖实际集合的操作了,完美对应你说的SQL里那种无表计算、处理虚拟数据的需求~
一、直接做数值计算(类似SQL的SELECT 10 + 15;)
你可以用db.aggregate()结合$documents阶段生成虚拟文档,然后在投影里完成计算,完全不需要碰任何真实集合。比如计算10+15的和:
db.aggregate([ { $documents: [{}] }, // 生成一个空的虚拟文档作为输入 { $project: { sum: { $add: [10, 15] }, _id: 0 } } ])
执行后会直接返回:
{ "sum" : 25 }
二、处理虚拟数据并过滤(类似SQL的values子句操作)
如果要处理像[1,2,3]这样的虚拟数组,过滤出小于2的元素,也有两种常用方式:
方式1:在投影阶段直接过滤(适合简单场景)
db.aggregate([ { $documents: [{ numbers: [1, 2, 3] }] }, // 构造包含目标数组的虚拟文档 { $project: { filtered_numbers: { $filter: { input: "$numbers", cond: { $lt: ["$$this", 2] } }, _id: 0 } } } ])
返回结果:
{ "filtered_numbers" : [1] }
方式2:展开数组后匹配(适合需要多步处理的复杂场景)
如果后续还要对过滤后的元素做更多操作,比如分组、统计,可以先展开数组再过滤:
db.aggregate([ { $documents: [{ numbers: [1, 2, 3] }] }, { $unwind: "$numbers" }, // 把数组拆成单个文档 { $match: { numbers: { $lt: 2 } } }, // 过滤出符合条件的元素 { $group: { _id: null, filtered_numbers: { $push: "$numbers" } } }, // 重新组合成数组 { $project: { _id: 0 } } ])
结果和上面一致~
小提醒
如果你还在使用4.4之前的MongoDB版本,就没法用$documents了,这时候可以临时创建一个空集合,或者用$facet来构造虚拟数据,但显然升级到4.4+用$documents是最省心的方案。
备注:内容来源于stack exchange,提问作者count_campeador
相关产品推荐
相关产品推荐

