4

如果我的 MongoDB 中有一个对象需要在我的系统中的任何地方使用,那么它就在它自己的集合中。但是,我不太清楚如何让数据自动显示在它所连接的其他对象上。
这是一个例子:

Schema1 = { name: String }  
Schema2 = { something: String, other_thing: [{schema1_id: String}] }

现在我想要的是能够说出var name = mySchema2.name;并获得链接Schema1对象的名称。
我正在使用 Mongoose、Express 和 Node.js,并且我已经尝试为此使用 Mongoose 的“虚拟”,但是当我说res.send(myobject);我在对象的任何地方都看不到虚拟属性时。

做这个的最好方式是什么?

4

3 回答 3

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 允许您以简单方便的方式通过点字符查询评论的字段。例如,如果我们只想查询主题以“汽车”开头的评论,我们将执行以下操作:

myPostModel.find({ 'comment.subject' : /car*/ }).exec(function(err, result){
    Do some stuff with the result...
});

请注意,为简单起见,帖子中的评论字段不是数组(在此示例中,每个帖子允许一条评论)。然而,即使它是一个数组,mongo 也以同样的方式非常优雅地引用数组的元素。

于 2013-01-17T09:07:33.247 回答
1

有几个插件可以帮助 Mongoose 中的 DBRefs。

mongoose-dbref使用 DBRef 标准,可能是一个不错的起点。

mongoose-plugins是我不久前写的,但它的工作方式略有不同。

于 2011-07-17T18:23:05.357 回答
-1

在 mongodb 中没有JOIN这样的词,因为连接扼杀了可伸缩性。但是大多数驱动程序都支持 DBRefs,它们只是发出额外的请求来加载引用的数据。所以你可以自己提出额外的请求来加载你在任何地方使用的对象。

如果您在应用程序的任何地方都使用某个对象,这听起来像是需要在缓存中的对象。但是如果有足够的内存将对象加载到内存中,mongodb 可以作为某种缓存工作。因此,为了简单起见,只需发出额外的请求来加载对象。

于 2011-07-17T08:45:50.997 回答