2016-02-06 3 views
2

Можете ли вы объяснить мне, как организовать модели мангуста для создания одного или нескольких соединений? Необходимо хранить отдельные коллекции.Mongoose one-to-many

Предположим, у меня есть магазины и пункты

//store.js

var mongoose = require('mongoose'); 

module.exports = mongoose.model('Store', { 
    name : String, 
    itemsinstore: [ String] 
}); 

//item.js

var mongoose = require('mongoose'); 
module.exports = mongoose.model('Item', { 
    name : String, 
    storeforitem: [String] 
}); 

я делаю это в правильном направлении?

И как получить доступ к данным прохода в arryas? Вот код yo введите имя в элемент. Но как ввести id в массив id (itemsinstore)?

app.post('/api/stores', function(req, res) { 
    Store.create({ 
     name: req.body.name, 
    }, function(err, store) { 
     if (err) 
      res.send(err); 
    }); 
}) 

ответ

6

Вы должны использовать эталонную модель и populate() метод: http://mongoosejs.com/docs/populate.html

Определите модели:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var storeSchema = Schema({ 
    name : String, 
    itemsInStore: [{ type: Schema.Types.ObjectId, ref: 'Item' }] 
}); 
var Store = mongoose.model('Store', storeSchema); 

var itemSchema = Schema({ 
    name : String, 
    storeForItem: [{ type: Schema.Types.ObjectId, ref: 'Store' }] 
}); 
var Item = mongoose.model('Item', itemSchema); 

Сохранить новый пункт в существующий магазин:

var item = new Item({name: 'Foo'}); 
item.save(function(err) { 

    store.itemsInStore.push(item); 
    store.save(function(err) { 
    // todo 
    }); 
}); 

Получить товары из магазина

Store 
    .find({}) // all 
    .populate('itemsInStore') 
    .exec(function (err, stores) { 
    if (err) return handleError(err); 

    // Stores with items 
}); 
+0

Если '' store' в store.itemsInStore.push (пункт) '' быть Store' (капитализируются)? Я не вижу 'store'. Только учится. –

+0

Нет, вы должны инициализировать новый с помощью 'var store = new Store ({})' и сохранить его, конечно. Или выберите один из базы данных. – Festo

+1

Итак, если бы я хотел добавить новый элемент в хранилище 'a' (пример), я бы сделал' var store = Store.find ({name: "a"}) '** внутри **' item.save '. Теперь 'store' будет документом, в котором есть поле' name' и значение 'a', и теперь я могу нажать элемент в массив' itemsInStore' этого конкретного документа. Надеюсь, у меня есть смысл. –

1

Хорошо, это то, как вы определяете: Зависимость от

var mongoose = require('mongoose'); 

module.exports = mongoose.model('Todo', { 
    name : String, 
    itemsinstore: [{ type: Schema.Types.ObjectId, ref: 'Item' }] 
}); 

И убедитесь, что у вас есть разные названия:

var mongoose = require('mongoose'); 
module.exports = mongoose.model('Item', { 
    name : String, 
    storeforitem: [String] 
}); 

Следите за Item в обоих случаях.

И тогда вы просто хотите передать массив ObjectID в нем. Подробнее здесь: http://mongoosejs.com/docs/populate.html

0

Попробуйте это:

Store.findOne({_id:'5892b603986f7a419c1add07'}) 
    .exec (function(err, store){ 
    if(err) return res.send(err); 

    var item = new Item({name: 'Foo'}); 
    item.save(function(err) { 

    store.itemsInStore.push(item); 
    store.save(function(err) { 
    // todo 
}); 
}); 
+2

, пожалуйста, добавьте объяснение к вашему ответу - просто демпинг-код без каких-либо комментариев * не * хороший способ написать ответ. –

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