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