Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongodb多对多关系_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongodb多对多关系

Node.js Mongodb多对多关系,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在开发一个基于mean.js的webapp,其中一部分是有标签的项目,类似于一个博客网站,每个博客条目都有标签 我到处都在寻找一个很好的例子/教程,解释使用mongodb/mongoose创建多对多关系的最佳方法,但我似乎什么也找不到 每个项目都可以有多个标记,我希望用户能够找到具有特定标记的所有项目 我非常感谢任何关于实现这一目标的正确方法的建议/示例。TIA似乎您只想在项目架构中拥有一个标记数组 var Tags = new Schema({ name : String });

我正在开发一个基于mean.js的webapp,其中一部分是有标签的项目,类似于一个博客网站,每个博客条目都有标签

我到处都在寻找一个很好的例子/教程,解释使用mongodb/mongoose创建多对多关系的最佳方法,但我似乎什么也找不到

每个项目都可以有多个标记,我希望用户能够找到具有特定标记的所有项目


我非常感谢任何关于实现这一目标的正确方法的建议/示例。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,现在我知道什么是不应该做的:)你什么时候会发布我应该做的文章?