排除嵌套字段并仅投影几个字段



在此 JSON 代码段中,我只想检索 3 个字段_id.RULES.1.0._Rules.stringValue_id.MYOPERATION_id.CURRENTSTATE

{
"_id" : {
"RULES" : [
{ 
"@class" : "a.b.c.Rules",
"_Rules" : {
"@class" : "a.b.c.RulesType",
"type" : 2,
"stringValue" : "Y_RULES"
}
}
],
"MYOPERATION" : 1,
"CURRENTSTATE" : "PROPOSED"
}
}

我已经尝试了以下 https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/

db.results.find(
{},
{
"_id.CURRENTSTATE":1, 
"_id.RULES.1.0._Rules.stringValue":1,
"_id.CURRENTSTATE":1
}
)

我得到的结果与db.results.find();相似

任何想法或想法表示赞赏。

您实际上无法从嵌入内容中选择字段,尤其是从这样的数组中选择字段。如果您需要该级别的操作,则需要使用aggregate()$project

db.results.aggregate([
{ "$project": {
"_id": {
"MYOPERATION": 1,
"CURRENTSTATE": 1,
"RULES": {
"$arrayElemAt": [
{ "$map": {
"input": "$_id.RULES",
"in": {
"_Rules": { 
"stringValue": "$$this._Rules.stringValue"
} 
}
}},
0
]
}
}
}}
])

这将返回第一个数组索引的完整路径:

{
"_id" : {
"MYOPERATION": 1,
"CURRENTSTATE" : "PROPOSED",
"RULES" : {
"_Rules" : {
"stringValue" : "Y_RULES"
}
}
}
}

或者,如果您只想要指定键的"值",那么您可以执行以下操作:

db.results.aggregate([
{ "$project": {
"_id": {
"MYOPERATION": 1,
"CURRENTSTATE": 1,
"stringValue": {
"$arrayElemAt": [
"$_id.RULES._Rules.stringValue",
0
]
}
}
}}
])

它只返回该值:

{
"_id" : { 
"MYOPERATION": 1,
"CURRENTSTATE" : "PROPOSED", 
"stringValue" : "Y_RULES"
}
}

无论哪种情况,您都$arrayElemAt要从特定数组索引返回值,而不是此类数据的"索引表示法"。您希望$map在需要转换数组中内容的任何位置

还有:

db.results.aggregate([
{ "$project": {
"_id": 0,
"MYOPERATION": "$_id.MYOPERATION",
"CURRENTSTATE": "$_id.CURRENTSTATE",
"RULES._Rules.stringValue": "$_id.RULES._Rules.stringValue"
}}
])

但这可能不会返回您实际想要的内容,因为数组条目在实际结束值上变得"反转":

{
"MYOPERATION": 1,
"CURRENTSTATE" : "PROPOSED",
"RULES" : {
"_Rules" : {
"stringValue" : [
"Y_RULES"
]
}
}
}

无论您追求什么最终结果,它都更有可能涉及$arrayElemAt和可能$map方法的某种组合,以获得您真正想要的结果。

另请注意,_id看起来并不是存储所有这些信息的好地方,看起来更像是一个错误而不是故意的。该结构具有非常XML的"感觉",就好像它是从原始源转换而来的。在这种情况下,您最好查看该转换过程,并在该输出插入MongoDB之前实际"重塑"该输出。

最新更新