为 RESTful 应用程序设计 mongo 'schema'
Designing mongo 'schema' for RESTful application
我正在尝试通过编写应用程序自学 mongo,并且我正在努力寻找设计 mongo 'schema' 的最佳方法(我知道它是无模式的,但这可能是我理解的核心问题,因为我来自关系背景)
无论如何,该应用程序是一个礼品列表管理器,用户可以在其中创建一个礼品列表并将他们想要收到的礼品添加到他们的列表中。其他用户可以订阅列表,并可以将礼物列表中的礼物标记为claimed/purchased。 (以免圣诞节收到重复礼物的问题!)
目前我的 GiftLists 集合不是 'relational',而只是 GiftList 文档的集合以及 Gifts 的子文档,如下所示:
{
"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
就不会也购买了。
目前,gifts 数组中的每个 Gift 都是 sub-document,没有自己的 id,我认为这就是我陷入 understanding/thinking.[=31= 的地方]
我正在尝试通过 RESTful 界面提供应用程序功能。
- 对于
POST
一个新的礼物列表 url 是 /giftList/add
其中请求正文是新的礼物列表
- 给
GET
个人礼物清单,包括 child 礼物的 url 是 /giftList/<listId>
- 例如:/giftList/55e9924848c4ffd723890b48
考虑到以上几点,我自然而然的下一步是能够将礼物标记为已领取,也许是:
PUT
到url/gift/claim/<giftId>
但是我在 Gift 子文档中没有任何 id
所以也许我的 url 应该是:
/giftList/<listId>/claim/<giftId>
但是同样,我在 Gift 子文档中没有 id
或者我可能会尝试使用商品的描述
/gift/claim/<gift description>
例如:/gift/claim/Mongo+book
但是如果不止一个人有一份包含 'Mongo book' 的礼物清单,并且 URL 编码描述的字符可能会很乱
或者我可以参考礼物清单
/giftList/<listId>/claim/<gift description>
例如:/giftList/55e9924848c4ffd723890b48/claim/New+socks
但是我声明的是 'New socks' 的哪个实例? (毕竟每个人圣诞节都需要很多新袜子!)
或者我参考了礼物的索引
/giftList/<listId>/claim/<gift index>
例如:/giftList/55e9924848c4ffd723890b48/claim/2
但这感觉很脆弱(因为它意味着列表必须始终以相同的顺序呈现)
对我来说真正的感觉是我需要另一个集合,只是为了礼物,其中每个礼物文档都有自己的 id,然后我可以在我的 RESTful url 中引用它.并且要么 Gift 引用了它的 parent GiftList,要么 GiftList 引用了一组 Gifts
但这完全是一种非常 'relational' 的思维方式……不是吗?
最好的方法是什么?或者,如果没有 'best' 方法,我有什么选择?
您可以使用新集合来解决这个问题,或者您可以为每个列表条目添加一个唯一标识符字段。唯一标识符的 MongoDB 解决方案正在生成 ObjectId,就像用于文档 _id
字段的那些一样。大多数 MongoDB 数据库驱动程序应该公开生成 ObjectId 的功能。有关详细信息,请参阅您的数据库驱动程序的文档。
我正在尝试通过编写应用程序自学 mongo,并且我正在努力寻找设计 mongo 'schema' 的最佳方法(我知道它是无模式的,但这可能是我理解的核心问题,因为我来自关系背景)
无论如何,该应用程序是一个礼品列表管理器,用户可以在其中创建一个礼品列表并将他们想要收到的礼品添加到他们的列表中。其他用户可以订阅列表,并可以将礼物列表中的礼物标记为claimed/purchased。 (以免圣诞节收到重复礼物的问题!)
目前我的 GiftLists 集合不是 'relational',而只是 GiftList 文档的集合以及 Gifts 的子文档,如下所示:
{
"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
就不会也购买了。
目前,gifts 数组中的每个 Gift 都是 sub-document,没有自己的 id,我认为这就是我陷入 understanding/thinking.[=31= 的地方]
我正在尝试通过 RESTful 界面提供应用程序功能。
- 对于
POST
一个新的礼物列表 url 是/giftList/add
其中请求正文是新的礼物列表 - 给
GET
个人礼物清单,包括 child 礼物的 url 是/giftList/<listId>
- 例如:/giftList/55e9924848c4ffd723890b48
考虑到以上几点,我自然而然的下一步是能够将礼物标记为已领取,也许是:
PUT
到url/gift/claim/<giftId>
但是我在 Gift 子文档中没有任何 id
所以也许我的 url 应该是:
/giftList/<listId>/claim/<giftId>
但是同样,我在 Gift 子文档中没有 id
或者我可能会尝试使用商品的描述
/gift/claim/<gift description>
例如:/gift/claim/Mongo+book
但是如果不止一个人有一份包含 'Mongo book' 的礼物清单,并且 URL 编码描述的字符可能会很乱
或者我可以参考礼物清单
/giftList/<listId>/claim/<gift description>
例如:/giftList/55e9924848c4ffd723890b48/claim/New+socks
但是我声明的是 'New socks' 的哪个实例? (毕竟每个人圣诞节都需要很多新袜子!)
或者我参考了礼物的索引
/giftList/<listId>/claim/<gift index>
例如:/giftList/55e9924848c4ffd723890b48/claim/2
但这感觉很脆弱(因为它意味着列表必须始终以相同的顺序呈现)
对我来说真正的感觉是我需要另一个集合,只是为了礼物,其中每个礼物文档都有自己的 id,然后我可以在我的 RESTful url 中引用它.并且要么 Gift 引用了它的 parent GiftList,要么 GiftList 引用了一组 Gifts
但这完全是一种非常 'relational' 的思维方式……不是吗?
最好的方法是什么?或者,如果没有 'best' 方法,我有什么选择?
您可以使用新集合来解决这个问题,或者您可以为每个列表条目添加一个唯一标识符字段。唯一标识符的 MongoDB 解决方案正在生成 ObjectId,就像用于文档 _id
字段的那些一样。大多数 MongoDB 数据库驱动程序应该公开生成 ObjectId 的功能。有关详细信息,请参阅您的数据库驱动程序的文档。