gpt4 book ai didi

node.js - 使用 Mongoose 从 Node 的 MongoDB 中的复杂嵌入式集合中插入、更新和删除

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:46 25 4
gpt4 key购买 nike

我正在 NodeJS 中开发一个使用 MongoDB 的演示应用程序,当前使用的模块是 Express 和 Mongoose。

主要思想是重新制作一个 PHP+MySQL 应用程序,其中 MySQL 数据库由三个表组成,采用 1:N 关系:Company->Field->Item

示例数据收集如下所示:

[
{"id": 1,"name": "DemoCompanyOne", "fields":[
{"id": 1, "location": "DemoLocationOne", "items":[
{"_id": 1,"name": "DemoItemOne","price": 1500,"count": 16,"date": "2013-11-02 16:53:19"},
{"_id": 2,"name": "DemoItemTwo","price": 890,"count": 211,"date": "2013-11-02 16:53:19"}
]},
{"id": 2, "location": "DemoLocationTwo", "items":[
{"_id": 3,"name": "DemoItemThree","price": 9990,"count": 10,"date": "2013-11-02 19:12:40"},
{"_id": 4,"name": "DemoItemFour","price": 2500,"count": 20,"date": "2013-11-02 19:12:42"}
]}
]},
{"id": 2,"name": "DemoCompanyTwo", "fields":[
{"id": 3, "location": "DemoLocationThree", "items":[
{"_id": 5,"name": "DemoItemFive","price": 79000,"count": 11,"date": "2013-11-02 16:56:13"},
{"_id": 6,"name": "DemoItemSix","price": 649,"count": 8760,"date": "2013-11-02 16:56:13"},
{"_id": 7,"name": "DemoItemSeven","price": 149,"count": 4320,"date": "2013-11-02 16:57:19"}
]}
]}
]

我在 Mongoose 中制定了方案,如下:

var Schema = mongoose.Schema, ObjectId = Schema.ObjectId

var Items = new Schema({
_id: ObjectId,
name: String,
price: Number,
count: Number,
date: { type: Date, default: Date.now }
});

var Field = new Schema({
id: Number,
location: String,
items: [Items]
});

var Company = new Schema({
id: Number,
name: String,
Fields: [Field]
});

var cmp = mongoose.model('company', Company, "company");
var flds = mongoose.model('fields', Field, "fields");
var itm = mongoose.model('items', Items, "items");

请注意,Mongo 中项目的 _id 已更改为 ObjectId,因为我希望这能帮助我更好地处理这些嵌入式集合 - 但事实并非如此。

我想将项目插入到指定位置,或增加所选项目的计数,或删除所选项目。

company_id 和 field_id 包含在 URL 中,如下所示:

app.post('/:company_id/:field_id', function(req, res) { ... })

在此处理程序中,我将请求分开,例如:

app.post('/:company_id/:field_id', function(req, res) {
var company = req.params.company_id;
var field = req.params.field_id;
if (req.body.new != null)
{
cmp.findOne({}).where('id').equals(company).where('fields.id').equals(field).exec(function(err, comps) {
if (comps == null)
{ res.render('error', {title: 'Error!', msg: 'No such field!'}); }
else
{
i=0;
while (i < comps.fields.length && comps.fields[i].id != field)
{ i++; }
var r = new itm({"_id": "", "name": req.body.name, "price":req.body.price, "count":req.body.count});
comps.fields[i].items.push(r);
comps.save();
}
});
}
else if (req.body.mod != null)
{
//...
}
else if (req.body.del != null)
{
//...
}
res.redirect('/'+company+'/'+field);
})

如您所见,在添加项目时,我使用线性搜索来查找字段,我可以在其中推送新制作的项目...这非常非常难看,我确信一定有更简单的方法来做到这一点...

那么,增量或删除又如何呢?我不想以同样的方式...

第四个问题:您对 ID 有何看法?如何实现它们?我应该在任何地方使用 ObjectId,还是根本没有必要?

感谢任何帮助和想法!

最佳答案

我的愿景是,如果嵌入式文档几乎是静态的,则可以使用它们。您的对象对我来说看起来是动态的,所以我建议您尝试使用文档引用:

var Schema = mongoose.Schema, ObjectId = Schema.ObjectId

var Items = new Schema({
_id: ObjectId,
name: String,
price: Number,
count: Number,
date: { type: Date, default: Date.now }
field: {type: Schema.Types.ObjectId, ref: 'Field'}
});

var Field = new Schema({
id: Number,
location: String,
company: {type: Schema.Types.ObjectId, ref: 'Company'}
items: [{type: Schema.Types.ObjectId, ref: 'Items'}]
});

var Company = new Schema({
id: Number,
name: String,
fields: [{type: Schema.Types.ObjectId, ref: 'Field'}]
});

因此,您可以像 MySQL 中一样保留父引用 + 将子引用保留为数组以快速填充。因此,您不必搞乱嵌套文档:

Field.findOne({_id: fieldid}).exec(function(err, field){...do whatever you need...})

此外,我不建议将您的模型称为“Items”。用单数来调用它,例如“Item”。

关于node.js - 使用 Mongoose 从 Node 的 MongoDB 中的复杂嵌入式集合中插入、更新和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20096030/

25 4 0
文章推荐: html - 将

与我的图像问题的底部对齐
文章推荐: c - 与 C 的接口(interface)程序集
文章推荐: c - QNX VM 不支持 zmq_vmci?
文章推荐: css - 制作等高的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com