我想做与这个相反的事情。我想在 _id: 1 文档的子文档上创建一个标记字段。问题是匹配标准是动态的。因此,无论谁匹配 $match 标准,我都想在 $graphLookup 的帮助下在这些匹配文档的子文档上设置标签。
像这样
db.collection.aggregate([
{ // This part is fully dynamic could be anything here.
"$match": {
name: "C:"
}
},
//Make a graph lookup so that update happens on childs
{
$set:{
tags:["#new","#cool","#vibes"]
}
}
])
示例数据集:
[
{
"_id": 1,
"name": "C:"
},
{
"_id": 2,
"parentFolderId": 1,
"name": "Users"
},
{
"_id": 3,
"parentFolderId": 2,
"name": "<username>"
},
{
"_id": 4,
"parentFolderId": "3",
"name": "Desktop"
},
{
"_id": 5,
"parentFolderId": "4",
"name": "alpha.tsx"
},
{
"_id": 6,
"parentFolderId": "1",
"name": "Program Files"
},
{
"_id": 7,
"parentFolderId": "1",
"name": "System32"
},
{
"_id": 8,
"parentFolderId": "1",
"name": "Program Files(x86)"
}
]
据我了解,图形查找可以帮助我更新文档的父项,但不能帮助我更新子项。即使有某种方法如何将一个父文档映射到聚合管道中的多个子文档。
一个选项是:
db.collection.aggregate([
{$graphLookup: {
from: "collection",
startWith: "$parentFolderId",
connectFromField: "parentFolderId",
connectToField: "_id",
as: "parents"
}},
{$match: {$expr: {$eq: [{$in: ["C:", "$parents.name"]}, true]}}},
{$unset: "parents"},
{$set: {tags: ["#new", "#cool", "#vibes"]}},
{$merge: {into: "collection"}}
])
查看它在 playground 示例中的工作原理