如果我的MongoDB中有一个对象需要在我的系统中随处使用,那么它就在它自己的集合中。但是,我还没弄清楚如何让数据自动显示在它加入的其他对象上 这是一个例子:
Schema1 = { name: String }
Schema2 = { something: String, other_thing: [{schema1_id: String}] }
现在我想要的是能够说var name = mySchema2.name;
并获取链接的Schema1
对象的名称。
我正在使用Mongoose,Express和Node.js,我尝试使用Mongoose'virtual',但是当我说res.send(myobject);
时,我没有在对象的任何地方看到虚拟属性。
这样做的最佳方式是什么?
答案 0 :(得分:3)
我知道你提出这个问题还有很长时间,但这可能有助于其他人 如果您使用此参考,您可能需要考虑使用嵌入式文档。嵌入式文档的好处是,当您查询父文档时可以获得它们,因此它可以节省您的额外查询,并且缺点是父文档可能变得很大(甚至非常大),因此您应该使用它们,但要小心使用它们。登记/> 这是一个简单的嵌入式文档的例子。我们将嵌入它(代码有点伪),而不是在帖子文档中引用需要额外查询的“注释”:
var postSchema = new Schema({ author : {type : String}, title : {type : String, required : true}, content : {type : String, required : true}, comment : { owner : {type : String}, subject : {type: String, required : true}, content : {type String, required : true} } });
MongoDB允许您通过点字符查询注释字段的简单方便方法。例如,如果我们只想查询其主题以“car”开头的评论,我们按以下方式执行:
myPostModel.find({ 'comment.subject' : /car*/ }).exec(function(err, result){ Do some stuff with the result... });
请注意,为了简化示例,帖子中的注释字段不是数组(在此示例中,每个帖子都有一个注释)。但是即使它是一个数组,mongo也会以同样的方式非常优雅地引用数组的元素。
答案 1 :(得分:1)
在Mongoose中有几个插件可以帮助DBRefs。
mongoose-dbref使用DBRef标准,可能是一个很好的起点。
mongoose-plugins是我前一段时间写过的,但它的工作方式略有不同。
答案 2 :(得分:-1)
在mongodb中没有 JOIN 这样的词,因为连接杀死了可扩展性。但是大多数驱动程序都支持DBRef,它们只是提出了加载引用数据的额外请求。 因此,您可以自己另外请求加载您在任何地方使用的对象。
如果你在应用程序的任何地方使用某个对象,它听起来像需要在缓存中的对象。但是如果有足够的内存将对象加载到内存中,mongodb可以作为某种缓存工作。因此,为了保持简单,只需要另外加载对象请求。