猫鼬一对多

Mar*_*rat 4 routes mongoose node.js

你能解释一下如何组织mongoose模型来创建一对多的连接吗?需要保留单独的集合.

假设我有商店和商品

//store.js

var mongoose = require('mongoose');

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

//item.js

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

我是以正确的方式做到的吗?

以及如何访问传递数据到arryas?这是代码输入项目的名称.但是如何输入id到id的数组(itemsinstore)?

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

Fes*_*sto 17

您应该使用模型参考和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);
Run Code Online (Sandbox Code Playgroud)

将新项目保存到现有商店:

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

  store.itemsInStore.push(item);
  store.save(function(err) {
    // todo
  });
});
Run Code Online (Sandbox Code Playgroud)

从商店获取商品

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

    // Stores with items
});
Run Code Online (Sandbox Code Playgroud)


Ren*_*lho 11

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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 })
    })
}
Run Code Online (Sandbox Code Playgroud)

请记住,toJSON()默认情况下,虚拟机不包含在输出中。如果你想使用依赖于函数时填入虚函数展现出来JSON.stringify(),就像快车res.json() 功能,设置virtuals: true你的架构的选择toJSON方案。

// Set `virtuals: true` so `res.json()` works
const StoreSchema = new Schema({
    name: String
}, { toJSON: { virtuals: true } });
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加有关 `toJSON` 的提示。我被困在那里,想知道为什么我的回答不包括那些该死的孩子 (2认同)