2013-08-18 3 views
4

Я использую Node.JS, Express, MongoDB и EJS. У меня есть вопрос о нескольких коллекциях MongoDB под одной базой данных и их вызова для использования в интерфейсе. У меня есть 3 коллекции, и после многих исследований не удалось найти, как вызвать несколько коллекций без ошибок.Node.JS, Express & MongoDB :: Несколько коллекций

Я понимаю, что было бы неважно хранить все под одной коллекцией, но я считаю, что наилучшим подходом было бы разделить их по категориям. Вот моя коллекция дб/вызов:

app.use(express.bodyParser()); 
var MongoClient = require('mongodb').MongoClient; 

app.get('/', function(req, res){ 
    MongoClient.connect("mongodb://localhost:27017/michael", function(err, db) { 
    if(!err) { 
     console.log("We are connected"); 
    } 
    db.collection("portfolio", function(err, collection) { 
     collection.find().sort({order_num: 1}).toArray(function(err, result) { 
     var portfolio = []; 
     if (err) { 
      throw err; 
     } else { 
      for (i=0; i<result.length; i++) { 
      portfolio[i] = result[i]; 
      } 
      res.render('index.html', {portfolio: portfolio}); 
     } 
     }); 
    }); 
    }); 
}); 

Как я мог бы сделать несколько вызовов дополнительных коллекций, таких как «о» коллекции, и т.д.? Я попробовал, добавив еще один ...

db.collection("about", function(err, collection) { 

... в пределах ...

MongoClient.connect("mongodb://localhost:27017/michael", function(err, db) { 

... но это дает мне ошибки в лог консоли терминала.

Заранее спасибо.

EDIT:

Вот что я пытаюсь сделать, это дает мне ошибку:

app.get('/', function(req, res){ 
    MongoClient.connect("mongodb://localhost:27017/michael", function(err, db) { 
    if(!err) { 
     console.log("We are connected"); 
    } 
    db.collection("portfolio", function(err, collection) { 
     collection.find().sort({order_num: 1}).toArray(function(err, result) { 
     var portfolio = []; 
     if (err) { 
      throw err; 
     } else { 
      for (i=0; i<result.length; i++) { 
      portfolio[i] = result[i]; 
      } 
      res.render('index.html', {portfolio: portfolio}); 
     } 
     }); 
    }); 
    // Here's the additional collection call: 
    db.collection("about", function(err, collection) { 
     collection.find().sort({order_num: 1}).toArray(function(err, result) { 
     var about = []; 
     if (err) { 
      throw err; 
     } else { 
      for (i=0; i<result.length; i++) { 
      about[i] = result[i]; 
      } 
      res.render('index.html', {about: about}); 
     } 
     }); 
    }); 
    }); 
}); 

Вот ошибку из консоли:

ReferenceError: /Volumes/Files/WebDev/RHC/michael/michael/views/index.html:62 
60|    <div class="row-fluid"> 
61|     <ul id="work" class="thumbnails"> 
>> 62|      <% for(i=0; i<portfolio.length; i++) { %> 
63|       <% if (portfolio[i].proj_type == "work") { %> 
64|        <% var newLine = ""; %> 
65|        <% var fancyBox = ""; %> 

portfolio is not defined 

Я имеют две коллекции в MongoDB под db под названием «michael», и я пытаюсь назвать их оба под одним MongoClient.connect(). Затем я отправляю результаты в front-end (через EJS) в двух массивах: «портфолио» и «о». Кажется, что, когда я это делаю, он делает «портфель» неопределенным. Надеюсь, это имеет смысл.

+0

Что Ошибка? – WiredPrairie

+0

Спасибо за ответ. Вот ошибка: «ReferenceError: /Volumes/Files/WebDev/RHC/michael/michael/views/index.html:62 <фрагмент кода, отображающий строку нарушения> var_name не определено в <списке оскорбительных элементов>« Извините, полный ошибка слишком длинная для комментария. – zickonezero

+0

Интересно, что когда я добавляю новый вызов 'db.collection', ссылаясь на новую коллекцию в рамках одного и того же запроса db, страница будет отображаться при некоторых обновлениях и будет пропускать все CSS на других. Кажется, что пытаться вызвать другую коллекцию и подталкивать ее к интерфейсу, запутывает EJS и делает предыдущую коллекцию var undefined. – zickonezero

ответ

2

Хорошо, используя решение aesede, а также мое собственное мастерство, я получил его, чтобы отобразить две коллекции. Это, вероятно, может использовать некоторые ловко, но вот что я получил:

// GLOBAL ARRAYS FOR STORING COLLECTION DATA 
var collectionOne = []; 
var collectionTwo = []; 
app.get('/', function(req, res){ 
    MongoClient.connect("mongodb://localhost:27017/michael", function(err, db) { 
    if(!err) { 
     console.log("We are connected"); 
    } 
    db.collection("collectionOne", function(err, collection) { 
     collection.find().sort({order_num: 1}).toArray(function(err, result) { 
     if (err) { 
      throw err; 
     } else { 
      for (i=0; i<result.length; i++) { 
      collectionOne[i] = result[i]; 
      } 
     } 
     }); 
     db.collection("collectionTwo", function(err, collection) { 
     collection.find().sort({order_num: 1}).toArray(function(err, result) { 
      if (err) { 
      throw err; 
      } else { 
      for (i=0; i<result.length; i++) { 
       collectionTwo[i] = result[i]; 
      } 
      } 
     }); 
     }); 
     // Thank you aesede! 
     res.render('index.html', { 
     collectionOne: collectionOne, 
     collectionTwo: collectionTwo 
     }); 
    }); 
    }); 
}); 

Единственная ошибка, сама по себе, что я нашел, было то, что, когда узел перезапускается и я нажимаю «обновить» в браузере, я не видел любой контент, отображаемый в HTML. Однако любое последующее обновление показывало контент последовательно.

+1

Вместо того, чтобы вставлять вызовы вашей коллекции, например, вы можете проверить [async] (http://github.com/caolan/async). Это модуль, который поддерживает обработку нескольких асинхронных процессов, с возможностью вызова функции, когда ** все ** процессы завершены. – mattsch

+0

Прохладный, я проверю! – zickonezero

0

У меня такая же проблема, и теперь я знаю, что это связано с тем, что вы не можете res.render() дважды. Есть решение, которое некоторые рекомендуют: используя socket.io. Мне хотелось бы узнать, есть ли другое решение, в моем случае я хочу получить рецепты и авторы из двух разных коллекций mongoDB, но я не могу сделать это только с 1 res.render(), не верю node.js + express + mongoose не выполнит что-то, что просто сделать, скажем ... LAMP.

+0

Это странно. Итак, в чем смысл иметь несколько коллекций под одним db в Mongo? – zickonezero

+0

На самом деле я понял, поэтому мой предыдущий комментарий бесполезен. Я нашел 2 diff способы делать то, что ОП спрашивает: 1 (уродливый) Recetas.find ({}). exec (function (err, recetas) { if (err) {...} Autores.find ({}, function (err, autores) { if (err) {...} \t res.render ('index', { \t recetas: recetas, \t autores: autores \t}); }); }); 2 (хорошенькая) Добавить в схеме: autor_id: {Тип: Schema.Types.ObjectId, ссылка: 'Autores'}. затем Recetas.find ({}) заполнения ('autor_id') .exec (функция (ERR, Recetas) {\t \t , если (ERR) {console.log (ERR)} res.render ('индекс', { Recetas: Recetas }); }); – aesede

+0

Спасибо! Autores и Recetas - это две разные коллекции, да? Можно ли разместить это как ответ? Для меня решение № 1 легко понять (и не так уродливо!), А № 2 менее желательно, так как оно изменяет схему. Гонг, чтобы попробовать это! – zickonezero

0
app.get("/customer",function(req,res) { 
    var orders={}; //Create Empty order Object 
    var products={}; //Create Empty product Object 
    Product.find({},function (err,allproducts) { 
     if (err) { 
      console.log(err); 
     } else { 
      //Find Collection And Assign It To Object 
      products=allproducts;    
     } 
    }); 
    Order.find({}).sort({"date":'desc'}).exec(function(err, allOrders) { 
     if (err) { 
      console.log(err); 
     } else { 
      //find order collection and sort it in desending order and assign it to order object 
      orders=allOrders; 
      res.render("./customer/dashboard",{products:products , orders:orders}); 
     } 
    }); 

}); 

Я сталкивался с таким же вопросом я решить ее выше механизм я рекомендую использовать пустые объекты вместо массивов в качестве объекта MongoDB возвращается, а также вы можете столкнуться с некоторыми ошибками типа при использовании массивов вместо объектов