只能访问MongoDB响应中的顶级值

时间:2018-02-28 03:46:19

标签: node.js mongodb

我使用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);
    })
}

2 个答案:

答案 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
        }
      }
    });