如何使用图形查找更新匹配条件的所有子文档?

问题描述 投票:0回答:1

我想做与这个相反的事情。我想在 _id: 1 文档的子文档上创建一个标记字段。问题是匹配标准是动态的。因此,无论谁匹配 $match 标准,我都想在 $graphLookup 的帮助下在这些匹配文档的子文档上设置标签。

Mongo 游乐场示例

像这样

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)"
  }
]

据我了解,图形查找可以帮助我更新文档的父项,但不能帮助我更新子项。即使有某种方法如何将一个父文档映射到聚合管道中的多个子文档。

mongodb mongoose aggregation-framework
1个回答
0
投票

一个选项是:

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 示例中的工作原理

© www.soinside.com 2019 - 2024. All rights reserved.