如何访问对象内的`categoryIds`字段/键,包含mongodb的`ObjectId(s)`数组作为值?

时间:2016-05-16 11:45:34

标签: javascript node.js mongodb

我在Node.js中有以下代码。

var getQuestionsByUserId = function (config) {
var query = {
    _id: ObjectId(String(config.userId))
};
var projection = {
    categoryIds: true,
    _id: false
};
var respondWithCategories = function (error, docs) {
    var categoryIdsList = [];    // empty array
    if (docs.length > 0) {
        console.log("Inside if: ", docs[0]);      // as expected
        categoryIdsList = docs[0].categoryIds;    // becomes undefined !! the mystery statement
    }
    console.log("Outside if: ", docs, categoryIdsList);    // as expected considering above steps
};
UserModel.find(query, projection, respondWithCategories);
};

输出如下

Inside if: { categoryIds: [ 5731892996a8d72df29d8554, 572f9eb779c548660331071b ] }
Outside if: [ { categoryIds: [ 5731892996a8d72df29d8554, 572f9eb779c548660331071b ] } ] undefined

我使用Mongodb和Mongoose进行访问。 Mongodb版本:v3.2.1
Node.js版本:v5.5.0

问题很简单。如何从对象中获取categoryIdsdocs是一个包含单个对象的数组。 categoryIds是对象中唯一具有数组值的字段。

所以我通过docs[0].categoryIds访问了。我得到了undefined! 我在这里缺少什么?

我在浏览器js控制台上尝试过,它运行正常!

编辑:(捍卫此问题的唯一性) 这个标记为重复的问题与异步性质或回调无关,即使我已经提到了mongodb find方法的回调。 这个问题与数组中对象的神秘性质(我觉得我遗漏了一些东西)或ObjectId干扰数组或某种方式来解析JSON对象而不改变返回的ObjectId字段mongodb。

所以,请删除此问题的重复标记,并让其他人在这里帮助我。

1 个答案:

答案 0 :(得分:1)

感谢@JhonnyHK。他的评论帮助我解决了这个问题。

原来,UserModel架构中出现了一个粗心的错误,拼写错误。但好学习。

基本上,这里意味着该字段未在架构中定义。 因此,只要模式中缺少字段,即使对象看起来很好,访问它也会在node.js代码中产生undefined

<强>解决方案: 更正模式,定义模式中正确访问的字段。在这种情况下,应该更正UserModel架构。

提示 如果从JavaScript的角度看一切都是正确的,并且你从mongodb find method的回调参数访问对象时有一个神秘的undefined,请检查你的模式。