我使用node来访问下面显示的MongoDB中的数据,我的集合中的文档是:
{
"key_a" : "val_a",
"key_b" : [
{
"sub_b_keya" : "jenkins",
"sub_b_keyb" : "foo"
},
{
"sub_b_keya" : "kubernetes/0",
"sub_b_keyb" : "bar"
}
]
"key_c": 0
}
当我控制台记录响应时,它打印一切都很好,但当我尝试访问键的值时,“sub_b_keya”在下面的代码中未定义! .toArray()是不是将子文档加载到RAM中,只加载文档的顶部结构或什么东西?!
MongoClient.connect(uri, (err, client) => {
if (err){
console.log(err);
}
database = client.db(databaseName)
getAwsDisplayInstances(function(data){
if(data.length > 0){
db_response = data;
foo = db_response['key_b'][0]['sub_b_keya'];
console.log(foo); //This prints undefined
}
})
})
function getAwsDisplayInstances(callback){
var query = { key_a: "val_a" };
database.collection(awsCollectionName).find(query).toArray(function(err, result){
if (err){
throw err;
}
callback(result);
})
}
答案 0 :(得分:1)
mongoDB查找查询返回一个文档数组,您尝试访问返回的数据就好像它是一个对象
尝试
database.collection(awsCollectionName).findOne(query)
如果您只需要一个对象
其他循环数据
if(data.length > 0){
for(var db_response of data){
foo = db_response['key_b'][0]['sub_b_keya'];
console.log(foo); //This won't print undefined
}
}
答案 1 :(得分:1)
如果您正在使用find
,则还必须迭代数据,下面的代码可以正常使用findOne
查询。
getAwsDisplayInstances(function (data) {
if (data && data.hasOwnProperty('key_b')) {
for (let i = 0; i < data['key_b'].length; i++) {
const db_response = data['key_b'][i];
foo = db_response['sub_b_keya'];
console.log(foo); //This will print your required output
}
}
});