node.js:JSON点表示法+访问数组键

时间:2014-02-24 09:59:07

标签: arrays node.js mongodb mongoose syntax

我使用node.js,express,mongoDB& amp;猫鼬。 Mongoose给了我一个包含这个数组的数组:

[ { title: 'HTML in depth',
    author: 'kevin vanhove',
    _id: 53039f264a6324978c70084b,
    chapters: 
     [ { _id: 53039f264a6324978c70084d,
         content: '/jow',
         title: 'History of HTML' },
       { _id: 53039f264a6324978c70084c,
         content: '/w3c',
         title: 'What is the W3C' } ],
    __v: 0 } ]

我使用此代码在终端中获得此结果:

function indexData(books){

console.log(books)

res.render("index.html", {context:books, partials:{footer:"footer", header:"header"}})

}

现在我正在尝试访问章节[0] .title中的值,但是我收到了错误:

console.log(books[0].chapters[0].title)

TypeError: Cannot read property '0' of undefined

我在这里很困惑,我是否使用正确的点符号来访问该值?

更新1:完成终端输出

24 Feb 10:56:47 - [nodemon] restarting due to changes...
24 Feb 10:56:47 - [nodemon] starting `node app.js`
Mongoose: books.find({}) { fields: undefined }  

/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/routes/routes.js:45
        console.log(books[0].chapters[0].title)
                                     ^
TypeError: Cannot read property '0' of undefined
    at indexData (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/routes/routes.js:45:32)
    at Promise.<anonymous> (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/routes/routes.js:37:31)
    at Promise.<anonymous> (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at /Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/lib/query.js:1052:26
    at model.Document.init (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/lib/document.js:250:11)
    at completeMany (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/lib/query.js:1050:12)
    at Object.cb (/Users/kevinvanhove/Documents/work/projects/basing/business/klanten/javascript/nodeJS/express/basing/node_modules/mongoose/lib/query.js:1017:11)
24 Feb 10:56:49 - [nodemon] app crashed - waiting for file changes before starting...

部分解决方案:

我试图查看章节数据。更新我的mongoose模式以包含章节数据就可以了。

var booksSchema = new mongoose.Schema({
 title: String,
 author: String,
 chapters: [
    {
        title: String,
        content: String
    }
 ]

});

1 个答案:

答案 0 :(得分:1)

这在Mongoose(服务器)端不起作用。 find()的结果是游标,您需要从本机驱动程序部分通过toArray进行迭代或转换。像这样的东西

(假设架构Books):

Books.collection.find({}).toArray(function(err, results) {

  // results is an array that you can do something with here.

});

当然,如果你已经为数组及其不是 embedded的文档定义了额外的Schema,那么这会伤害更多,你需要使用迭代方法来将结果作为数组获得。

如果您需要books及其中的子项目中的特定项目,那么您最好使用operators调整查找查询,而不是返回所有结果。或者甚至aggregation pipeline可能会有所帮助。