Node.js 使用mongoose获取子文档的节点api

Node.js 使用mongoose获取子文档的节点api,node.js,mongodb,api,express,mongoose,Node.js,Mongodb,Api,Express,Mongoose,My MongoDB存储具有以下结构的文档: { "application_detail":{}, "curl_detail":{ "Curl1":{ "key1":"value1", "key2":"value2" }, "Curl2":{ "key1":"value1", "key2":"value2"

My MongoDB存储具有以下结构的文档:

{
    "application_detail":{},
    "curl_detail":{
        "Curl1":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl2":{
            "key1":"value1",
            "key2":"value2"        
        },
        "Curl3":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl4":{
            "key1":"value1",
            "key2":"value2"
        },
        /*total number of curls are unknown*/
    }
}
如何使用express和mongoose从mongoDB获取
curl\u detail
下所有卷发的
key1

预期产出:

{
    "curl_detail": {
        "Curl1": {
            "key1": "value1"
        },
        "Curl2": {
            "key1": "value1"
        },
        "Curl3": {
            "key1": "value1"
        },
        "Curl4": {
            "key1": "value1"
        }
    }
}

注意:卷发总数未知。

您可以使用投影进行查询:

collection.find({}, {"curl_detail":1}, (findError, results) => {
  if(findError) { 
    //handle the error
    return;
  }
  // here is the expected result
  console.log();
});

我建议您将数据结构从

"curl_detail": {
    "Curl1": {
        "key1": "value1",
        "key2": "value2"
    },
    "Curl2": {
        "key1": "value1",
        "key2": "value2"
    }
}

在数组中存储数据结构将使您能够以更简单的方式查找某些数据。此外,不需要对象具有诸如
Curl1
Curl2
等属性

对于新的数据结构,已经有了一些答案和解释:

(一)

(二)

(三)

更新

如果无法更改数据结构,请参阅此解决方案(使用
$arrayToObject
/
$objectToArray
确定嵌套密钥的名称,如“Curl1”):

这将产生以下结果:

[
  {
    "curl_detail": {
      "Curl1": {
        "key1": "value1"
      },
      "Curl2": {
        "key1": "value1"
      },
      "Curl3": {
        "key1": "value1"
      },
      "Curl4": {
        "key1": "value1"
      }
    }
  }
]

如果此结果也适用于您,您可以通过检查:

[
  {
    "curl_detail": {
      "Curl1": "value1",
      "Curl2": "value1",
      "Curl3": "value1",
      "Curl4": "value1"
    }
  }
]
您可以使用和使用以下聚合

db.collection.aggregate([
{
$addFields:{
卷曲图详情:{
$map:{
“输入”:{
$objectToArray:“$curl\u详细信息”
},
“as”:“el”,
“在”:{
“k”:“$$el.k”,
“v”:“$$el.v.key1”,
}
}
}
}
},
{
$项目:{
_id:0,
卷曲图详情:{
$arrayToObject:“$curl\u详细信息”
}
}
}
])

您可以像这样将此聚合用于mongoose,假设您的模型是MyModel:

MyModel.aggregate([
{
$addFields:{
卷曲图详情:{
$map:{
输入:{
$objectToArray:“$curl\u详细信息”
},
如:‘el’,
在:{
k:“$$el.k”,
v:“$$el.v.key1”
}
}
}
}
},
{
$项目:{
_id:0,
卷曲图详情:{
$arrayToObject:“$curl\u详细信息”
}
}
}
])。然后(res=>{
控制台日志(res);
});

查询的预期输出是什么样的?发布您希望从mongoose查询获得的预期输出。
{“curl_detail”:{“Curl1”:{“key1”:“value1”},Curl2:{“key1”:“value1”},Curl3:{“key1”:“value1”},Curl4:{“key1”:“value1”}/*对于该文档中存在的所有卷发,依此类推*/}
@AnkitaKuchhadiya这是我期望的结果。这个结果对你也有效吗<代码>“curl_detail”:{“Curl1”:“value1”,“Curl2”:“value1”,“Curl3”:“value1”,“Curl4”:“value1”}@SuleymanSah这对我很有用。你能提供一个相同的mongoose代码吗?请检查我的更新答案以使用mongoose的聚合。这给了我以下结果:
{“curl_detail”:{“Curl1”:{“key1”:“value1”,“key2”:“value2”},“Curl2”:{“key1”:“value1”,“key2”:“value2”},“Curl3”:{“key1”:“value1”,key2:“value2”},Curl4:{“key1:“value1”,“key2:“value2”}}}
它是如何工作的?@SuleymanSah你是对的。这将返回旋度的所有场,这不是我所期望的。我只需要为所有卷发设置
key1
@Shubh@Ankita如果我错了,请纠正我。谢谢Hlib的推荐。但这是我目前无法处理的事情。我不允许对数据进行任何更改。我只需要在UI上获取并填充它。@KapilKhandelwal更新后的答案只是我答案的修订版。这是不友好的。请看他的编辑。@SuleymanSah事实上我也使用了相同的运算符,因为这个问题没有其他解决方案。最后,我的解决方案返回正确的数据结构。请有礼貌地接受别人的意见。谢谢你的回复@Hlib为我提供了我所期待的完美结果<代码>“curl_detail”:{“Curl1”:“value1”,“Curl2”:“value1”,“Curl3”:“value1”,“Curl4”:“value1”}这个输出本可以作为我的解决办法。@KapilKhandelwal他只是在我的答案之后更新了他的答案,复制并编辑了一行,这并不友好。如果你比较他的编辑历史,你会看到这一点。@KapilKhandelwal你至少可以投票支持我的答案,但如果你也能将其标记为答案,我将不胜感激。
[
  {
    "curl_detail": {
      "Curl1": {
        "key1": "value1"
      },
      "Curl2": {
        "key1": "value1"
      },
      "Curl3": {
        "key1": "value1"
      },
      "Curl4": {
        "key1": "value1"
      }
    }
  }
]
[
  {
    "curl_detail": {
      "Curl1": "value1",
      "Curl2": "value1",
      "Curl3": "value1",
      "Curl4": "value1"
    }
  }
]