在MongoDB嵌套数据中查找字段名称

发布于 2025-01-18 03:32:27 字数 318 浏览 0 评论 0原文

是否可以先使用正则表达式查找“​​字段名称”,然后使用该字段名称在所有文档中查找其值?

例如,如果我有以下结构:

item : Object
  - quantity: 50
  - size: Object
    - h: 20

理想情况下,如果我想要 h 的值,我会查询 item.quantity.size.h ("field.nestedField")。但是,我只知道名称“h”,但不知道它嵌套在什么下面。是否可以检索整个字段名称(item.quantity.size.h)及其值(20)?然后我想使用该字段名称从所有其他文档获取值。

Is it possible to find the 'field name' using a regex first and then use that field name to find its value across all documents?

For example, if I have the following structure:

item : Object
  - quantity: 50
  - size: Object
    - h: 20

Ideally, if I want the value of h, I would query item.quantity.size.h ("field.nestedField"). However, I only know the name 'h' but not what it is nested under. Is it possible to retrieve the entire field name (item.quantity.size.h) and its value (20)? I would then like to use that field name to obtain the value from all other documents.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

つ可否回来 2025-01-25 03:32:27

灵感来源: MongoDB javascript `"$function" ` 在 mongoplayground.net 中未返回预期值

您可以使用 $function 聚合,如下所示:

    db.collection.aggregate([
  {
    $project: {
      data: "$ROOT"
    }
  },
  {
    "$project": {
      "flattenKeys": {
        "$function": {
          "body": "function flatten(dataList, keysToHandle){while(keysToHandle.length){origKeyData = keysToHandle.shift();for (const newKey of Object.keys(origKeyData.objData)){keysToHandle.push({objData:origKeyData.objData[newKey],keyData:`${origKeyData.keyData}.${newKey}`});dataList.push(`${origKeyData.keyData}.${newKey}`);}}return dataList}",
          "args": [
            [],
            [
              {
                objData: "$data",
                keyData: "data"
              }
            ]
          ],
          "lang": "js"
        }
      }
    }
  },
  {
    $project: {
      matchingKeys: {
        $filter: {
          input: "$flattenKeys",
          as: "item",
          cond: {
            $regexMatch: {
              input: "$item",
              regex: "keyD"
            }
          }
        }
      }
    }
  }
])

了解如何它可以在这里

Inspired by: MongoDB javascript `"$function"` not returning expected value in mongoplayground.net

You can use a $function aggregation, like this:

    db.collection.aggregate([
  {
    $project: {
      data: "$ROOT"
    }
  },
  {
    "$project": {
      "flattenKeys": {
        "$function": {
          "body": "function flatten(dataList, keysToHandle){while(keysToHandle.length){origKeyData = keysToHandle.shift();for (const newKey of Object.keys(origKeyData.objData)){keysToHandle.push({objData:origKeyData.objData[newKey],keyData:`${origKeyData.keyData}.${newKey}`});dataList.push(`${origKeyData.keyData}.${newKey}`);}}return dataList}",
          "args": [
            [],
            [
              {
                objData: "$data",
                keyData: "data"
              }
            ]
          ],
          "lang": "js"
        }
      }
    }
  },
  {
    $project: {
      matchingKeys: {
        $filter: {
          input: "$flattenKeys",
          as: "item",
          cond: {
            $regexMatch: {
              input: "$item",
              regex: "keyD"
            }
          }
        }
      }
    }
  }
])

See how it works here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文