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 参数会创建一个新的输出字段

相关推荐
微爱帮监所写信寄信14 分钟前
微爱帮监狱寄信寄信信件草稿箱技术设计文档
数据库
2401_8762213422 分钟前
数据库系统概论——范式
数据库
DB虚空行者37 分钟前
MySQL恢复之Binlog格式详解
android·数据库·mysql
lkbhua莱克瓦2441 分钟前
基础-SQL-DQL
java·开发语言·数据库·笔记·mysql·dql
lkbhua莱克瓦241 小时前
基础-SQL-DCL
开发语言·数据库·笔记·mysql·dcl
Rainly20001 小时前
工作日志之postgresql实现分布式锁
数据库·分布式·postgresql
爬山算法2 小时前
Hibernate(6) Hibernate支持哪些数据库?
java·数据库·hibernate
老华带你飞2 小时前
房屋租赁管理系统|基于java+ vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
AC赳赳老秦3 小时前
财务数据智能解读:DeepSeek分析利润表生成异常波动原因报告
数据库·人工智能·postgresql·zookeeper·测试用例·时序数据库·deepseek
Li_7695323 小时前
Redis进阶(二)—— Redis 事务
数据库·redis·缓存