MongoDB聚合:$documents

$documents阶段可以根据输入值返回字面意义的文档。

语法

js 复制代码
{ $documents: <表达式> }

$documents接受可解析为对象数组的任何有效表达式,包括:

  • 系统变量,如 $$NOW $$SEARCH_META

  • $let 表达式

  • $lookup 表达式作用域中的变量

没有指向当前文档的表达式(如 $myField$$ROOT)将导致错误。

举例

测试管道阶段

下面例子为管道阶段创建测试和调试数据,无需创建测试集合。

js 复制代码
db.aggregate(
   [
      { $documents: [ { x: 10 }, { x: 2 }, { x: 5 } ] },
      { $bucketAuto: { groupBy: "$x", buckets: 4 } }
   ]
)

聚合表达式不指定集合。它使用$documents阶段中的输入数据作为$bucketAuto阶段的输入。

js 复制代码
[
  { _id: { min: 2, max: 5 }, count: 1 },
  { _id: { min: 5, max: 10 }, count: 1 },
  { _id: { min: 10, max: 10 }, count: 1 }
]

lookup 阶段使用 documents 阶段

使用$documents修改$lookup的输出。

创建locations集合:

js 复制代码
db.locations.insertMany(
   [
      { zip: 94301, name: "Palo Alto" },
      { zip: 10019, name: "New York" }
   ]
 )

使用$documents作为数据源来转换文件。

js 复制代码
db.locations.aggregate(
   [
      { $match: {} },
      { $lookup:
         {
            localField: "zip",
            foreignField: "zip_id",
            as: "city_state",
            pipeline:
              [
                 { $documents:
                    [
                       { zip_id: 94301, name: "Palo Alto, CA" },
                       { zip_id: 10019, name: "New York, NY" }
                    ]
                 }
              ]
         }
      }
   ]
 )

输出将locations集合中的数据与$documents管道阶段中的值相关联。

js 复制代码
[
   {
      _id: ObjectId("618949d60f7bfd5f5689490d"),
      zip: 94301,
      name: 'Palo Alto',
      city_state: [ { zip_id: 94301, name: 'Palo Alto, CA' } ]
   },
   {
      _id: ObjectId("618949d60f7bfd5f5689490e"),
      zip: 10019,
      name: 'New York',
      city_state: [ { zip_id: 10019, name: 'New York, NY' } ]
   }
]
  • zip 字段对应 zip_id 字段

  • as 参数会创建一个新的输出字段

相关推荐
喪彪30 分钟前
MySQL新手教学
数据库·mysql·adb
丘大梨3 小时前
QT 基础聊天应用项目文档
运维·数据库·系统架构
HMBBLOVEPDX3 小时前
MySQL的多版本并发控制(MVCC):
数据库·mysql·mvcc
.用户昵称已存在.3 小时前
MongoDB 从入门到精通:安装配置与基础操作指令详解
数据库·mongodb
ClouGence4 小时前
CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
数据库·sql·ci/cd
sukalot5 小时前
window显示驱动开发—在混合系统中使用跨适配器资源
数据库·驱动开发·音视频
洛卡卡了5 小时前
数据库加密方案实践:我们选的不是最完美,但是真的够用了。
数据库·后端·面试
幽络源小助理5 小时前
MySQL实战优化高手教程 – 从架构原理到生产调优
数据库·mysql·架构
Runing_WoNiu5 小时前
Redis主从架构、哨兵模式及集群比较
数据库·redis·架构