MongoDb:聚合 $lookup
Posted
技术标签:
【中文标题】MongoDb:聚合 $lookup【英文标题】:MongoDb: aggregation $lookup 【发布时间】:2022-01-05 15:59:14 【问题描述】:鉴于以下集合。 我必须得到标题字段并结合到标识符
凭据:
_id: ..
title: ..
USER_CREDENTIAL:
_id: ..
credential_id: .. (from credential collection)
created_at: ..
identifier:
first_name: ..
middle_name: ..
last_name: ..
响应应该是:
user_credential_id:
member:
first_name:
middle_name:
last_name:
title:
created_at:
【问题讨论】:
我已经撤消了似乎意外删除您问题的大部分信息的操作。 【参考方案1】:$lookup
- 使用管道连接 user
和 user_credential_id
以匹配条件 ($match
) 并装饰文档 ($project
)。
$unwind
- 将 member
数组解构为多个文档。
$project
- 装饰输出文档。
db.user.aggregate([
"$lookup":
"from": "user_credential",
let:
"user_credential_id": "$_id",
"title": "$title"
,
pipeline: [
$match:
$expr:
$eq: [
"$credential_id",
"$$user_credential_id"
]
,
$project:
first_name: "$identifier.first_name",
middle_name: "$identifier.middle_name",
last_name: "$identifier.last_name",
title: "$$title",
created_at: "$created_at",
],
"as": "member"
,
$unwind: "$member"
,
$project:
_id: 0,
user_credential_id: "$_id",
member: 1
])
Sample Mongo Playground
【讨论】:
结果为空数组 $match 是什么? 能否提供样本文件证明? $match 运算符用于过滤符合过滤条件的文档。 我想在nodejs中使用聚合方法所以这就是为什么,你能帮帮我吗?【参考方案2】:你可以试试这个查询
db.user.aggregate([
$lookup:
from: "credentials",
localField: "credential_id",
foreignField: "_id",
as: "user_credential"
,
$unwind: "$user_credential"
,
$project:
_id: 0,
user_credential_id: "$credential_id",
member:
first_name: "$identifier.first_name",
middle_name: "$identifier.middle_name",
last_name: "$identifier.last_name",
title: "$user_credential.title",
created_at: "$created_at",
])
您可以查看here
【讨论】:
结果为空数组 $match 是什么? 根据您的问题,您没有指定您希望查询匹配某个值,您想要的只是集成标题字段并将其组合到基于 user_credential 的每个文档的标识符。这是第一,第二你说你得到一个空数组,这很奇怪,你试过我在帖子中留下的链接吗? mongoplayground.net/p/oJIzHWnOs-w 我想在nodejs中使用聚合方法所以这就是为什么,你能帮帮我吗? 模式中的猫鼬以上是关于MongoDb:聚合 $lookup的主要内容,如果未能解决你的问题,请参考以下文章