2014-10-24 2 views
0

У меня есть идея ресторана, у которой будут ветки, а каждая ветка имеет меню, и в каждом меню есть предметы с указанной ценой для этой ветки!Комплексное отношение в Mongoose

и моя схема:

var mongoose = require('mongoose'); 

var eaterySchema = mongoose.Schema({ 
    name: String, 
    type: Number, 
    branches: [{type: Schema.Types.ObjectId, ref: 'Branch' }] 
}); 

var branchSchema = mongoose.Schema({ 
    id: Number, 
    name: String, 
    eatery: {type: Schema.Types.ObjectId, ref: 'Eatery'}, 
    menu: {type: Schema.Types.ObjectId, ref: 'Menu'} 
}); 

var menuSchema = mongoose.Schema({ 
    branch: {type: Schema.Types.ObjectId, ref: 'Branch'}, 
    items: [{type: Schema.Types.ObjectId, ref: 'Item'}] 
}); 

var itemSchema = mongoose.Schema({ 
    name: String, 
    description: String 
}); 

var itemMenuSchema = mongoose.Schema({ //Many-To-Many Table 
    menu: {type: Schema.Types.ObjectId, ref: 'Menu'}, 
    item: {type: Schema.Types.ObjectId, ref: 'Item'}, 
    price: Number 
}); 


var Eatery = mongoose.model('Eatery', eaterySchema); 
var Branch = mongoose.model('Branch', branchSchema); 
var Menu = mongoose.model('Menu', menuSchema); 
var Item = mongoose.model('Item', itemSchema); 
var ItemMenu = mongoose.model('ItemMenu', itemMenuSchema); 

ли запрос ниже написанные справа, чтобы получить меню с деталями и ценами для запрошенного филиала ид?

Branch 
.findOne({id: '@GivenId'}) 
.populate('eatery menu') 
.exec(function(err, doc){ 
     doc 
     .populate('menu.items') 
     .exec(function(err, doc){ 
      ItemMenu 
      .find({}) 
      .where('menu._id').equals(doc.menu._id) 
      .exec(function(err, items){ 
       doc.push(items); 
       res.send(docs); 
      }) 
     }) 
    };) 
}); 

и не мангуст обеспечивает заселить дело с последним запросом, который я написал в последнем обратном вызове? и какое лучшее решение для решения этого сложного отношения?

Большое спасибо

ответ

2

Эта схема является слишком относительна, и этот запрос будет гораздо медленнее, чем это должно быть. Чтобы получить максимальную отдачу от MongoDB, я бы рекомендовал полностью избавиться от ItemMenu: поскольку в каждом меню есть список элементов, его избыток, вы можете просто сохранить соответствующую цену в списке элементов меню.

Кроме того, вы можете рассматривать вложение элементов в каждое меню и/или вложение в документ филиала. Это сделает ваш запрос намного проще и намного быстрее.

Как правило, при разработке схемы MongoDB вы хотите структурировать свои объекты, чтобы легко отвечать на ваши наиболее распространенные вопросы. Это часто означает взаимосвязь «один к одному» или «один к одному». Не застревайте в реляционном мышлении - пытаясь структурировать документы MongoDB, как если бы строки SQL были верным способом сделать вашу жизнь труднее, чем это должно быть :)

+0

Большое спасибо. Я имел дело с этим как реляционным, потому что мангуста написана для рассмотрения mongoDB как объектов. как бы вы предпочли мне построить схему для этого примера, которая у меня выше? –

+0

Большое спасибо, вы спасли мой день :), говоря это, прежде чем получить ответ. и сто благодарности после этого;) –

Смежные вопросы