マングースモデルを整理して1対多の接続を作成する方法を教えてください。別々のコレクションを保持する必要があります。
私は店やアイテムを持っているとしましょう
//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にアクセスする方法は?これは、アイテムに名前を入力するコードです。しかし、idの配列(itemsinstore)にidを入力する方法は?
app.post('/api/stores', function(req, res) {
Store.create({
name: req.body.name,
}, function(err, store) {
if (err)
res.send(err);
});
})
モデル参照と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
});
Virtuals でベストプラクティスを使用して実行できます。
Store.js
_const mongoose = require('mongoose')
const Schema = mongoose.Schema
const StoreSchema = new Schema({
name: {
type: String,
required: true
},
createdAt: {
type: Date,
default: Date.now
}
})
StoreSchema.virtual('items', {
ref: 'Item',
localField: '_id',
foreignField: 'storeId',
justOne: false // set true for one-to-one relationship
})
module.exports = mongoose.model('Store', StoreSchema)
_
Item.js
_const mongoose = require('mongoose')
const Schema = mongoose.Schema
const ItemSchema = new Schema({
storeId: {
type: Schema.Types.ObjectId,
required: true
},
name: {
type: String,
required: true
},
createdAt: {
type: Date,
default: Date.now
}
})
module.exports = mongoose.model('Item', ItemSchema)
_
StoreController.js
_const Store = require('Store.js')
module.exports.getStore = (req, res) => {
const query = Store.findById(req.params.id).populate('items')
query.exec((err, store) => {
return res.status(200).json({ store, items: store.items })
})
}
_
デフォルトでは、仮想はtoJSON()
出力に含まれていないことに注意してください。 ExpressのJSON.stringify()
function のように、res.json()
に依存する関数を使用するときに仮想データを表示する場合は、_virtuals: true
_オプションをオンに設定します。スキーマのtoJSON
オプション。
_// Set `virtuals: true` so `res.json()` works
const StoreSchema = new Schema({
name: String
}, { toJSON: { virtuals: true } });
_
さて、これはあなたが依存関係を定義する方法です:
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
これを試して:
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
});
});