Node.js 猫鼬一对多

Node.js 猫鼬一对多,node.js,mongoose,routes,Node.js,Mongoose,Routes,你能解释一下如何组织猫鼬模型来创建一对多的连接吗?需要单独收藏 假设我有商店和物品 //store.js var mongoose = require('mongoose'); module.exports = mongoose.model('Store', { name : String, itemsinstore: [ String] }); //item.js var mongoose = require('mongoose'); module.exports = mo

你能解释一下如何组织猫鼬模型来创建一对多的连接吗?需要单独收藏

假设我有商店和物品

//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]
 });
我这样做对吗

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


好的,这就是定义依赖性的方式:

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]
 });
在这两种情况下都要注意


然后您只需要在其中传递objectid数组。请参阅此处的详细信息:

您应该使用模型参考和
填充()
方法:

定义您的模型:

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
});
试试这个:

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

您可以将最佳实践用于

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)
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)
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 })
    })
}
Item.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)
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)
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 })
    })
}
StoreController.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)
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)
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()
输出中不包括虚拟对象。如果要在使用依赖于
JSON.stringify()
的函数时显示填充虚拟现实,如Express'
res.JSON()
,请在模式的
toJSON
选项上设置
virtuals:true
选项

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

store
store.itemsinsstore.push(item)
中是否应该
store
(大写)?我没有看到
存储定义。不,你应该用
var-store=new-store({})
初始化一个新的,并保存它。或者从数据库中获取一个。好的,如果我想在store
a
(示例)中添加一个新项,我会执行
var store=store.find({name:“a”})
项中。save
。现在
store
将是具有字段
name
和值
a
的文档,现在我可以将该项推入该特定文档的
itemsInStore
数组中。我希望我说的有道理。@Festo在itemSchema中,storeForItem需要是一个数组吗?假设某个项目属于某个商店。它不应该只是ObjectId类型的对象,类似于1-n关系数据库。警察局。很抱歉英语不好根据MongoDB文档,如果itemsInStore需要无界,那么使用这种方法不是一个好主意。请参阅:请为您的答案添加一个解释-只转储没有任何注释的代码不是编写答案的好方法。感谢您添加关于
toJSON
的提示。我被困在那里,想知道为什么我的回答不包括那些变态的孩子们