查找比较 collection 数据与数组在 mongo 数据库中的聚合结果
lookup compare collection data with array in aggregate result in mongo DB
我想比较 collection 与数组的聚合结果
我有以下两个collection。
- 聊天collection
chat.tags 是参考键中的数组值来自标签 collection.
"chat": [
{
"id": "test1",
"tags": [
"AAA",
"BBB",
"CCC",
"AAA"
]
},
{
"id": "test2",
"tags": [
"AAA",
"BBB",
"CCC"
]
}
]
- 标签collection
"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”和聊天中唯一标签的结果 collection。
我想使用 mongo 聚合来跟踪结果。
使用查找时可以使用 from, let, pipeline 吗?
[
{
"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"
}
},
我想比较 collection 与数组的聚合结果
我有以下两个collection。
- 聊天collection
chat.tags 是参考键中的数组值来自标签 collection.
"chat": [
{
"id": "test1",
"tags": [
"AAA",
"BBB",
"CCC",
"AAA"
]
},
{
"id": "test2",
"tags": [
"AAA",
"BBB",
"CCC"
]
}
]
- 标签collection
"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”和聊天中唯一标签的结果 collection。
我想使用 mongo 聚合来跟踪结果。 使用查找时可以使用 from, let, pipeline 吗?
[
{
"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"
}
},