如何在 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 字段值的数组