2015-09-18 121 views
0

我试图通过编写应用程序来教自己mongo,而且我正在努力设计mongo'架构'的最佳方式(我知道它是无模式的,但这可能是我的理解是核心问题,因为我来自关系背景)为REST风格的应用程序设计mongo“架构”

无论如何,该应用程序是一个礼物列表管理器,用户可以创建一个礼物列表并添加他们想要收到的礼物给他们的礼物名单。其他用户可以订阅该列表,并且可以从礼品列表中标出所要求/购买的礼品。 (以避免在圣诞节得到重复礼物的问题!)

此刻我GiftLists收集不是“关系”,是一个简单的用的礼品子文件GiftList文件的集合,像这样:

{ 
    "GiftLists": [ 
     { 
      "_id": { 
       "$oid": "55e9924848c4ffd723890b48" 
      }, 
      "description": "Xmas List for Some User", 
      "gifts": [{ 
       "description": "Mongo book" 
       "claimed": false 
      }, 
      { 
       "description": "New socks" 
       "claimed": false 
      }, 
      { 
       "description": "New socks" 
       "claimed": false 
      }], 
      "owner": "some.user", 
      "subscribers": ["some.other.user", "my.friend"] 
     } 
    ] 
} 

想法是some.user是礼品清单的所有者,并添加了3件他希望收到的物品。 some.other.user已订阅该列表并可以看到礼品清单及其礼品。他可能会选择购买其中一件礼物,因此需要将其标记为my.friend也不会购买。

目前,礼物数组中的每个礼物都是没有自己的id的子文档,我认为这是我陷入理解/思考的地方。

我正在尝试使用RESTful界面提供应用程序功能。

  • POST新的礼品清单的网址是/giftList/add在请求体是新的礼物清单
  • GET个人的礼物清单,包括儿童礼品的URL为/giftList/<listId> - 如:/giftList/55e9924848c4ffd723890b48

考虑到上述情况,我自然的下一步就是要能够将礼物标记为声明,可能是:

  • PUT到url /gift/claim/<giftId>
    但我没有对礼品的子文件有任何IDS

所以,也许我的网址应为:

  • /giftList/<listId>/claim/<giftId>
    但同样,我不t在礼品子文档上有一个ID

或者我尝试使用该项目的描述

  • /gift/claim/<gift description>如:/gift/claim/Mongo+book
    但是如果不止一个人有含“蒙戈书”礼单,和URL编码描述的字符可能是凌乱

或者,也许我引用礼物清单

  • /giftList/<listId>/claim/<gift description>如:/giftList/55e9924848c4ffd723890b48/claim/New+socks
    但我会声称其“新袜”的实例? (毕竟,每个人都需要大量的新袜子的圣诞礼物!)

或者,也许我引用礼品

  • /giftList/<listId>/claim/<gift index>例如索引:/giftList/55e9924848c4ffd723890b48/claim/2
    但这种感觉脆弱(因为它意味着该列表必须始终以相同的顺序呈现)

对我来说,真正感觉是我需要另一个集合,仅用于Gifts,其中每个Gift文档都有其自己的ID,我无法在我的RESTful网址中提到了引用。礼物有一个对它的父母GiftList的引用,或者GiftList有一个对礼物的引用数组
但这是一种非常'关系'的思维方式......不是吗?

这样做的最好方法是什么?或者,如果没有“最佳”方式,我有什么选择?

回答

1

您可以用新的集合来解决这个问题,或者您可以为每个列表条目添加一个唯一标识符字段。用于唯一标识符的MongoDB解决方案生成​​,就像用于_id文档字段的那些一样。大多数MongoDB数据库驱动程序应该公开用于生成ObjectId的功能。有关详细信息,请参阅数据库驱动程序的文档。

+0

谢谢 - 我想我要去一个新的集合,并手动维护引用(而不是使用DBref)这里推荐http://docs.mongodb.org/master/reference/database-references /#ID4 –