2013-08-26 31 views
1

嗨i'm完全新手用MongoDB的,我来自SQL Server中,我有以下疑问 如果有波纹管结构:构建查询

专辑:电视

"_id": ObjectId("123456abc"), 
"brand": "Sony", 
"model": "Bravia", 
"price": 1000 

收藏:tvcomments

"_id": "_id": ObjectId("456789def"), 
"tv": ObjectId("123456abc"), 
"comments": [ 
     { 
      "user": ObjectId("413212eop"), 
      "text": "Very nice TV" 
     } 
] 

我倒是希望得到电视机与他们的意见,但我不觉得一个例子来做到这一点,也许是不可能的?

+1

'db.tvcomments.find({电视:object_id_of_tv_document})'? – Sammaye

+0

总是可以在电视集合中创建另一个名为“评论”的字段,然后只需从那里拉取信息。否则,请参阅@Sammaye的代码段 – tymeJV

+0

您一次只能从一个集合中检索文档。因此,如果不重构您的文档或集合,您无法在单个查询中获得它们。 – WiredPrairie

回答

3

MongoDB和SQL之间的一个区别是MongoDB中没有JOIN s。在MongoDB中为数据建模的首选方法是将文档嵌入到彼此中,而不是将它们分开并通过ObjectId引用它们。

您目前的做事方式需要两次前往数据库,一次是获取电视,另一次是获取评论。除非您打算在不引用电视的地方引用评论(不太可能),否则您可以直接将评论放入电视文档。现在,当您拉动电视文档时,您会收到“免费”评论。

{ 
    "_id": ObjectId("123456abc"), 
    "brand": "Sony", 
    "model": "Bravia", 
    "price": 1000, 
    "comments": [ 
      { 
       "user": ObjectId("413212eop"), 
       "text": "Very nice TV" 
      } 
    ] 
} 

请注意,我将引用留给了用户,而不是将其嵌入到电视文档中。在某些情况下,您只需执行多个查询即可获取数据,因为嵌入不是适当的关系。

这里看到更多的信息:http://docs.mongodb.org/manual/core/data-modeling/

+0

我正在阅读mongodb文档,具体介绍了有关手工参考的内容,并说明如下内容: 手动引用指的是在另一个文档中包含一个 文档的_id字段的做法。然后,应用程序可以发出第二个查询来根据需要解析引用的字段。 我不明白这个引用或DBRef的目标,它只给我一个参考,但它没有给我提供我需要的信息。 我需要一个集合中的电视和另一个集合中的用户,我不能在电视收藏中嵌入用户信息(名称,图像...)。 – RMontes13

+1

如果您拥有高度关系数据,MongoDB可能不适合您。在这种情况下,您的应用程序需要查询电视对象,然后获取已评论的用户列表,然后为这些用户进行第二次查询。无法在一个查询中恢复所有数据。 – Mason