Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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/2/node.js/42.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
Javascript Mongo-Mongoose数据桥接混淆_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongo-Mongoose数据桥接混淆

Javascript Mongo-Mongoose数据桥接混淆,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,从关系型数据库设计过渡到“非关系型”是一件有趣的事情 不管怎样 我设置了以下mongoose模型:用户,公司,工作,以及应用程序 当用户申请作业时,他们的应用程序与该作业关联 因此,一种方法是嵌套对作业中应用程序的引用: var JobSchema=新模式({ 标题:字符串, 描述:字符串, 应用程序:[{type:Schema.ObjectId,ref:'applications'}] }); 以及在应用程序上存储对用户和作业的引用: var应用程序=新模式({ 简历文件:字符串 用户:{t

从关系型数据库设计过渡到“非关系型”是一件有趣的事情

不管怎样

我设置了以下mongoose模型:用户公司工作,以及应用程序

当用户申请作业时,他们的应用程序与该作业关联

因此,一种方法是嵌套对作业中应用程序的引用:

var JobSchema=新模式({
标题:字符串,
描述:字符串,
应用程序:[{type:Schema.ObjectId,ref:'applications'}]
});
以及在应用程序上存储对用户和作业的引用:

var应用程序=新模式({
简历文件:字符串
用户:{type:Schema.ObjectId,ref:'user'}
作业:{type:Schema.ObjectId,ref:'job'}
});
很好,找到任何工作的申请人都很简单

接下来的问题是,如何获得用户的申请者?

我还必须将应用程序存储在用户上:

var User=newschema({
名称:String
电子邮件:String
应用程序:[{type:Schema.ObjectId,ref:'applications'}]
});
但是,现在-如果申请文档被删除(无论出于何种原因),我仍然会在工作文档和用户文档中“引用”该文档。因此,我将被要求找到用户和工作,获得这两个文件。。。找到正确的参考资料。。。从嵌套数组中删除它们。。。然后再次保存这两个文档

与具有表联接的关系数据库相比,这似乎非常荒谬,因为在关系数据库中甚至不存在这种无意义的引用。关联是隐含的

所以我想知道,这是唯一的办法吗?(故意修辞,但我没有更好的解决办法)

我们非常感谢您的建议和解答

这看起来很可笑,与使用表联接的关系数据库相比,这种完全没有意义的引用根本不存在。 关联是隐含的

Mongodb不是关系数据库,您不能期望非关系数据库的行为像关系数据库一样,所以是的,您需要手动清理数据,或者按照预期使用Mongodb,这意味着在作业文档中嵌入应用程序,并从用户处删除对应用程序的任何引用

现在一些ODM(比如PHP中的Mongo ODM)将为您进行清理,因为您可以在代码中应用“约束”,并级联删除、更新等。。。猫鼬不会这么做的


如果您的数据是关系型的,请使用RDBMS,不要使用MongoDB,尤其是如果您正在编写的平台上没有框架可以为您处理关系。

我个人可能会将其作为嵌入式模式,因为它可能会适合您的使用模式。有几点:

  • 作为阵列的应用程序。经过一些考虑,谁会有100甚至1000份申请。即便如此,它们真的都需要保留吗

  • 嵌入作业的简要详细信息。这看起来像是会被大量展示的东西,所以似乎值得将正在使用的东西嵌入其中

  • 作业详细信息作为链接对象。作业(或广告)可能包含更多信息,但在向用户显示摘要时不需要这些信息。因为所有的文档Id都在那里,所以您仍然可以调出链接的作业

  • 反向应用。无需在作业上存储关联的应用程序,用户上存在用户到作业的关联。因此,您仍然可以获取所有应用程序,尽管是在单独的查询中

var jobDetailSchema=新模式({
//工作的所有细节
});
var applicationSchema=新模式({
resumeFile:String,
工作:{
标题:字符串,
简短描述:字符串,
jobDetail:{type:Schema.ObjectId,ref:'jobDetail'}
}
},{u id:false});
var userSchema=新模式({
名称:String,
电子邮件:String,
应用程序:[应用程序模式]
});
var User=mongoose.model(“用户”,userSchema);
var jobdail=mongoose.model(“jobdail”,jobdailschema);
是的,这与关系方法不同,但这不是关系数据存储

如果一个工作消失了,你需要做一些清理吗?嗯,是的,但这并不需要太多的维护,即使链接断开了,也不会让人感到痛苦。你想仅仅因为工作被取消而失去一个应用程序细节吗?可能不会,所以这或多或少是正确的

如果整个嵌入应用程序的事情让您太害怕了,那么好吧,使用引用并涵盖所有调用
填充
的查询。但是,一般模型仍然摆脱了非典型的“多对多”建模案例。把事情弄平一点


正如智者所说,“你必须忘记你所学到的”,年轻的学徒。拥抱一个新世界,而不是固守旧世界。但是,如果它不适合您的项目,那么它就不是正确的工具。

建议一种解决方案来重新建模,而不仅仅是咆哮。这个问题确实需要另一个解决方案,即使有人提出了意见。我提供了一个解决方案,嵌入式文档。这不是咆哮。这是关于在工作中使用正确的工具,而不是mongodb,因为有人告诉某人使用它。我应该改写我的评论,说它很可笑。也许“相对不必要的复杂”更好。正如尼尔指出的,这是一个不同的范例。尼尔,谢谢你提供了一个伟大的分析。您的观点“这与关系方法不同,但这不是关系数据存储。”非常有力。你是对的,如果链接成功,应该不会有问题。接受+1@TaylorMac很抱歉你不得不忍受另一个咆哮。