2013-01-28 7 views
0

Мой объект, как,MongoDB запрашивая вложенные объекты

{ 
    "Team-A": { 
     "captain": "A", 
     "homeGround": "some ground", 
     "winLoss": "12-4-0" 
    }, 
    "Team-B": { 
     "captain": "B", 
     "homeGround": "some ground 2", 
     "winLoss": "4-4-4" 
    } 
} 

Мне нужно, чтобы отобразить эту информацию,

<h1>Team-A</h1> 
<h2>some ground</h2> 
<h3>12-4-0</h3> 

<h1>Team-B</h1> 
<h2>some ground2</h2> 
<h3>4-4-4</h3> 

Nodejs:

MongoClient.connect("mongodb://localhost:27017/MY_DB_TEST", function(err, db) { 
     if(!err) { 
     console.log("We are connected");   

     var collection = db.collection('football_teams');  
     var stream = collection.find().stream(); 

     stream.on("data", function(item){ 
      console.log(item); 
      res.render('index', {obj: item }); 
     });  
     } 
    }); 

Джейд:

h1= obj.captain 
h2= obj.homeGround 
h3= obj.winLoss 

Мой выход консоли:

{ _id: 51064fa1e0d5d118b4b29aa0, 
    'Team-A': { 
     'captain": 'A', 
     'homeGround": 'some ground', 
     'winLoss': '12-4-0' 
    } } 

title is not defined 
    at eval (eval at <anonymous> (C:\node_modules\jade\lib\jade.js:176:8)) 
    at exports.compile (C:\node_modules\jade\lib\jade.js:181:12) 
    at Object.exports.render (C:\node_modules\jade\lib\jade.js:216:14) 
    at View.exports.renderFile [as engine] (C:\node_modules\jade\lib\jade.js:243:13) 
    at View.render (C:\node_modules\express\lib\view.js:75:8) 
    at Function.app.render (C:\node_modules\express\lib\application.js:503:10) 
    at ServerResponse.res.render (C:\node_modules\express\lib\response.js:721:7) 
    at CursorStream.exports.index (C:\Users\HFR&D\Desktop\nodemongoexpress\routes\index.js:18:8) 
    at CursorStream.EventEmitter.emit (events.js:96:17) 
    at CursorStream._onNextObject (C:\Users\HFR&D\Desktop\nodemongoexpress\node_modules\mongodb\lib\mongodb\cursorstream 

Я не понять, как я должен петлю через мой объект и получить значения Team-A/Team-B и их соответствующие детали.

Как достичь этого, используя nodejs и jade.

UPDATE:

Say есть 20 команд, моя коллекция будет состоять из 20 документов. То, что я хочу сделать, - прокрутить мою коллекцию и отобразить информацию в 20 документах, как описано выше.

  • Является ли моя структура db правильной? Должен ли я иметь другой документ для каждой команды?

  • Если да, то как я могу получить название документов (команда A, команда-B) динамически при рендеринге в нефрите?

+0

Можете ли вы показать весь шаблон индекса нефрита? – gmaliar

+0

@Guy Вот и все, есть инструкция 'extends layout', которая расширяет мою« главную страницу ». Я очень новичок в mongo/node/jade, поэтому я не знаю, как запросить db для получения значений 'Team-A' и его деталей. Это то, что я хочу знать –

+1

Вам нужно переработать свою схему, чтобы каждая команда имела свой собственный документ с полем «имя», определяющим имя команды. – JohnnyHK

ответ

0

Вы действительно получаете Team-A коллекции, как вы видите его в console.log

{ _id: 51064fa1e0d5d118b4b29aa0, 
    'Team-A': { 
     'captain": 'A', 
     'homeGround": 'some ground', 
     'winLoss': '12-4-0' 
    } } 

Ошибка вы получаете title is not defined, поэтому я предполагаю, что-то другое нарушает ваш код. (Возможно, название переменной для макета не установлен?)

После устранения этой проблемы сделать вот так

h1= obj['Team-A'].captain 
h2= obj['Team-A'].homeGround 
h3= obj['Team-A'].winLoss 

Это даст вам данные.

+0

Можно ли получить «Team-A» динамически? так как это имя моего документа. Я обновил свой вопрос, пожалуйста, посмотрите –

+0

Вы можете проверить ключи объектов и сопоставить их с регулярным выражением,/Team- [A | B] /, если он найдет его, он вернет найденный, то вы можете использовать это как obj [WhatIFoundFromRegex], но это немного глупый способ сделать это, я бы прослушал @JohnnyHK и изменил схему базы данных. – gmaliar

0
var myobj = { 
"Team-A": { 
    "captain": "A", 
    "homeGround": "some ground", 
    "winLoss": "12-4-0" 
}, 
"Team-B": { 
    "captain": "B", 
    "homeGround": "some ground 2", 
    "winLoss": "4-4-4" 
} 
}; 

var key = Object.keys(obj)[0] // gives you the first key i.e. Team-A. its an array so every key is easily accessible. 
var captain = myobj[key].captain // gives 'A' 
var homeGround = myobj[key].homeGround // gives 'some ground' 
var winloss = myobj[key].winloss //gives "12-4-0" 
Смежные вопросы