如何在 mongoDB 的集合数组中获取字段名称?

Posted

技术标签:

【中文标题】如何在 mongoDB 的集合数组中获取字段名称?【英文标题】:How to fetch field Names inside an Array of Collection in 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 中存在的数组详细信息 【参考方案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 修改了我的答案

以上是关于如何在 mongoDB 的集合数组中获取字段名称?的主要内容,如果未能解决你的问题,请参考以下文章

我如何每 15 分钟获取一个包含 mongodb 字段值的数组

如何根据MongoDB中文档字段中的每个数组项过滤集合

如何在mongodb的对象数组中获取指定字段的值

mongodb如何获取表结构,以及表字段的名称?

MongoDB如何将数组中的字段类型从字符串更改为数组并保持原始值

mongodb本机驱动程序获取没有数据库名称的集合名称