【问题标题】:How to fetch field Names inside an Array of Collection in mongoDB?如何在 mongoDB 的集合数组中获取字段名称?
【发布时间】:2022-01-03 17:13:54
【问题描述】:

我正在尝试获取 mongo DB 集合中存在的字段名称,到目前为止我已经构建到这里:

db.getCollection('appd_application_master').aggregate([
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$unwind":"$arrayofkeyvalue"},
  {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}},
  {"$unwind":"$allkeys"}
])

但问题是,如果集合包含任何数组,那么我无法访问其中的字段,请帮助或指导正确的方向?TIA

这是一个集合的样本记录

{
  "_class": "com.json.SvnCommitMst",
  "_id": "38735",
  "author": "10662365",
  "commitDate": ISODate( "2021-09-30T08:28:01.159Z"),
  "isLatest": false,
  "mapSvnFilesMst": [
    {
      "_id": ObjectId( "618df1b32109446cb6ef58d6"),
      "commitAction": "MODIFY"
    }
  ],
  "message": "Rohit:\n\nUser Repo tool validation changes",
  "projectToolId": 92
}

我在当前查询中得到的响应:

{
    "_id" : null,
    "allkeys" : [ 
        "isLatest", 
        "author", 
        "_id", 
        "message", 
        "projectToolId", 
        "_class", 
        "mapSvnFilesMst", 
        "commitDate"
    ]
}

【问题讨论】:

  • 你能发布你想要得到的输出吗?
  • 也许是this?
  • @Takis_ 我想要字段 mapSvnFilesMst 中存在的数组详细信息

标签: database mongodb mongodb-query nosql aggregation-framework


【解决方案1】:

基于您知道数组名称的假设,您可以使用两个$project 阶段来组合所有键。在这两个变量中,您可以引用多个变量。

$let 运算符可以方便地摆脱额外的阶段:

{
    $addFields: {
        mapSvnFilesMst: {
            $reduce: {
                input: "$mapSvnFilesMst",
                initialValue: [],
                in: {
                    $setUnion: [
                        "$$value",
                        {
                            $let: {
                                vars: {
                                    kv: { $objectToArray: "$$this" }
                                },
                                in: "$$kv.k"
                            }
                        }
                    ]
                }
            }
        }
    }
},
{
    $project: {
        allKeys: {
            $setUnion: [
                "$mapSvnFilesMst",
                {
                    $let: {
                        vars: { kv: { $objectToArray: "$$ROOT" } },
                        in: "$$kv.k"
                    }
                }
            ]
        }
    }
}

Mongo Playground

您也可以尝试以下查询来扫描您的文档而不指定任何数组的名称 - 仅适用于一级数组(无递归):

db.collection.aggregate([{
    $project: {
        allKeys: {
            $reduce: {
                input: { $objectToArray: "$$ROOT" },
                initialValue: [],
                in: {
                    $setUnion: [
                        "$$value",
                        {
                            $cond: {
                                if: { $eq: [ { $type: "$$this.v" }, "array" ] },
                                then: {
                                    $setUnion: [
                                        ["$$this.k"],
                                        {
                                            $reduce: {
                                                input: "$$this.v",
                                                initialValue: [],
                                                in: {
                                                    $setUnion: [
                                                        "$$value",
                                                        {
                                                            $let: {
                                                                vars: { kv: { $objectToArray: "$$this" } },
                                                                in: "$$kv.k"
                                                            }
                                                        }
                                                    ]
                                                }
                                            }
                                        }
                                    ]
                                },
                                else: [ "$$this.k" ]
                            }
                        }
                    ]
                }
            }
        }
    }
}])

Mongo Playground (2)

【讨论】:

  • 在不知道数组是哪个字段的情况下可以采用某种方法吗?
  • @RubénVega 修改了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多