web-dev-qa-db-ja.com

マングース1対多

マングースモデルを整理して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);
    });
})
6
Marat

モデル参照と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
});
19
Gergo

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 } });
_
13
Renan Coelho

さて、これはあなたが依存関係を定義する方法です:

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

1
www.eugenehp.tk

これを試して:

 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
 });
});
0
Andnoos