Node.js Mongodb多对多关系
我正在开发一个基于mean.js的webapp,其中一部分是有标签的项目,类似于一个博客网站,每个博客条目都有标签 我到处都在寻找一个很好的例子/教程,解释使用mongodb/mongoose创建多对多关系的最佳方法,但我似乎什么也找不到 每个项目都可以有多个标记,我希望用户能够找到具有特定标记的所有项目Node.js Mongodb多对多关系,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在开发一个基于mean.js的webapp,其中一部分是有标签的项目,类似于一个博客网站,每个博客条目都有标签 我到处都在寻找一个很好的例子/教程,解释使用mongodb/mongoose创建多对多关系的最佳方法,但我似乎什么也找不到 每个项目都可以有多个标记,我希望用户能够找到具有特定标记的所有项目 我非常感谢任何关于实现这一目标的正确方法的建议/示例。TIA似乎您只想在项目架构中拥有一个标记数组 var Tags = new Schema({ name : String });
我非常感谢任何关于实现这一目标的正确方法的建议/示例。TIA似乎您只想在项目架构中拥有一个标记数组
var Tags = new Schema({
name : String
});
var Projects = new Schema({
tags : [String] // When you save a Tag just save the Name of it here
});
// This way you could easily look it up
// Assuming "name" was passed in as a param to express
Projects.find({ 'tags' : req.params.name }) // voila!
还有其他方法(如保存objectid
)。
如果您认为标记名可能经常更改,那么这种方法会更容易,但是如果标记被“删除”,您必须再次查看所有项目以删除该ObjectId
tags : [{ type: Schema.ObjectId, ref : 'Tags' }]
基本上,其要点是您正在项目模型中的“标记”数组中保存字符串或ObjectId引用(名称)
只需记住,当您要编辑标记名/删除标记/等时,您需要浏览并更新(如果它们保存为字符串)/从数组中包含这些标记的任何项目中删除这些标记。似乎您只想在项目架构中包含一个标记数组
var Tags = new Schema({
name : String
});
var Projects = new Schema({
tags : [String] // When you save a Tag just save the Name of it here
});
// This way you could easily look it up
// Assuming "name" was passed in as a param to express
Projects.find({ 'tags' : req.params.name }) // voila!
还有其他方法(如保存objectid
)。
如果您认为标记名可能经常更改,那么这种方法会更容易,但是如果标记被“删除”,您必须再次查看所有项目以删除该ObjectId
tags : [{ type: Schema.ObjectId, ref : 'Tags' }]
基本上,其要点是您正在项目模型中的“标记”数组中保存字符串或ObjectId引用(名称)
请记住,当您要编辑标记名/删除标记/等时,您将需要检查并更新(如果它们保存为字符串)/从数组中包含这些标记的任何项目中删除这些标记。对于多对多关系,我发现非常有用 以下是使用mongoose关系模块解决此问题的示例:
// In TagsModel.js file ----------------------------------------------
var mongoose = require('mongoose');
var schema = mongoose.Schema;
var relationship = require("mongoose-relationship");
var tagSchema = new schema({
projects: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Project',
childPath: 'tags'
}],
....
});
tagSchema.plugin(relationship, {
relationshipPathName: 'projects'
});
var tagModel = mongoose.model('Tag', tagSchema);
--------------------------------------------------------------------
// In ProjectModel.js file -----------------------------------------
var mongoose = require('mongoose');
var schema = mongoose.Schema;
var Projects = new Schema({
tags : [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Tag'
}],
...
});
var tagModel = mongoose.model('Project', tagSchema);
使用此模型结构,您将能够按特定标记查找项目,并按项目查找标记 对于多对多关系,我发现它非常有用 以下是使用mongoose关系模块解决此问题的示例:
// In TagsModel.js file ----------------------------------------------
var mongoose = require('mongoose');
var schema = mongoose.Schema;
var relationship = require("mongoose-relationship");
var tagSchema = new schema({
projects: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Project',
childPath: 'tags'
}],
....
});
tagSchema.plugin(relationship, {
relationshipPathName: 'projects'
});
var tagModel = mongoose.model('Tag', tagSchema);
--------------------------------------------------------------------
// In ProjectModel.js file -----------------------------------------
var mongoose = require('mongoose');
var schema = mongoose.Schema;
var Projects = new Schema({
tags : [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Tag'
}],
...
});
var tagModel = mongoose.model('Project', tagSchema);
使用此模型结构,您将能够按特定标记查找项目,并按项目查找标记 在两个集合中保留一个id数组。例如: 第1部分:
{
_id: ObjectId("56784ac717e12e59d600688a"),
coll2_ids: [ObjectId("..."), ObjectId("..."), ObjectId("..."), ...]
}
第2部分:
{
_id: ObjectId("56784ac717e12e59d600677b"),
coll1_ids: [ObjectId("..."), ObjectId("..."), ObjectId("..."), ...]
}
这种方法的优点是,当您拥有来自任一集合的文档时,只需执行以下操作即可立即从另一个集合中提取所有关联文档
obj = db.coll1.findOne({})
db.coll2.find({_id: {$in: obj['coll2_ids']}}) # returns all associated documents
反之亦然。在两个集合中保留一个id数组。例如: 第1部分:
{
_id: ObjectId("56784ac717e12e59d600688a"),
coll2_ids: [ObjectId("..."), ObjectId("..."), ObjectId("..."), ...]
}
第2部分:
{
_id: ObjectId("56784ac717e12e59d600677b"),
coll1_ids: [ObjectId("..."), ObjectId("..."), ObjectId("..."), ...]
}
这种方法的优点是,当您拥有来自任一集合的文档时,只需执行以下操作即可立即从另一个集合中提取所有关联文档
obj = db.coll1.findOne({})
db.coll2.find({_id: {$in: obj['coll2_ids']}}) # returns all associated documents
反之亦然。我开始了一个关于数据建模的博客系列。虽然不特定于任何角度或节点,但它可能有助于理解数据建模。第一篇文章是如何不做:第二部分即将到来。伟大的文章@MarkusWMahlberg,现在我知道什么是不应该做的:)你什么时候发布我应该做什么的文章?我开始了一个关于数据建模的博客系列。虽然不特定于任何角度或节点,但它可能有助于理解数据建模。第一篇文章是如何不去做:第二部分马上就要到了。伟大的文章@MarkusWMahlberg,现在我知道什么是不应该做的:)你什么时候会发布我应该做的文章?