arrays - 在 mongo DB 中查找比较集合数据与数组的聚合结果
问题描述
我想在聚合结果中将集合与数组进行比较
我有以下两个集合。
- 聊天合集
chat.tags 是引用键中的数组值,来自标签集合。
"chat": [
{
"id": "test1",
"tags": [
"AAA",
"BBB",
"CCC",
"AAA"
]
},
{
"id": "test2",
"tags": [
"AAA",
"BBB",
"CCC"
]
}
]
- 标签集合
"tag": [
{
"id": "1234",
"key": "AAA",
"name": "a"
},
{
"id": "1235",
"key": "BBB",
"name": "b"
},
{
"id": "1236",
"key": "CCC",
"name": "c"
},
{
"id": "1237",
"key": "DDD",
"name": "d"
},
]
我想导致 id 是“test1”和聊天集合中的唯一标签。
我想使用 mongo 聚合来跟踪结果。使用查找时是否可以使用 from、let、管道?
[
{
"chat": [
{
"id": "test1",
"setTags": [
"AAA",
"BBB",
"CCC"
]
}
],
"tag": [
{
"id": "1234",
"key": "AAA",
"name": "a"
},
{
"id": "1235",
"key": "BBB",
"name": "b"
},
{
"id": "1236",
"key": "CCC",
"name": "c"
}
]
}
]
请帮我。
解决方案
这可以通过一个简单的 来实现$lookup
,如下所示:
db.chat.aggregate([
{
$match: {
id: "test1"
}
},
{
$lookup: {
from: "tag",
localField: "tags",
foreignField: "key",
as: "tagDocs"
}
},
{
$project: {
chat: [
{
id: "$id",
setTags: "$tags"
}
],
tag: "$tagDocs"
}
}
])
- 我不完全理解您想要的输出结构是什么,但可以通过不同的
$project
阶段轻松更改它。
- - 编辑 - -
使用 Mongo 的 v3.6$lookup
语法,管道保持不变,只是$lookup
阶段发生了变化:
{
$lookup: {
from: "tag",
let: {
tagKeys: "$tags"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$key",
"$$tagKeys"
]
}
}
}
],
as: "tagDocs"
}
},
推荐阅读
- sql - 在通过表单验证并提交表单后,我想使用 Oracle Apex 动态操作将我重定向到我的应用程序中的另一个页面
- python-3.x - ** 导致 RuntimeWarning 的运算符:在 double_scalars 中遇到无效值
- flutter - Dart - 值可以为 null 的表达式必须先进行 null 检查,然后才能取消引用
- php - AppStoreConnect,salesReports 在 php 中返回句柄
- go - sort.Slice 和 sort.SliceStable 有什么区别
- windows - ENV 变量不是通过 npm start (run-script) 设置的(在 Windows git-bash 上)
- python - 列出不同用户python下目录中的所有文件
- java - 提取类型 [class org.springframework.http.ResponseEntity] 和内容类型 [text/html;charset=UTF-8] 的响应时出错;
- kubernetes - 如何将容器中的文件映射到 Kubernetes 中的卷中的文件?
- spring-webflux - Spring Flux Reactor 异步消费者完成