我正在尝试通过编写应用程序来教自己mongo,我正在努力设计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
也不会购买。
目前,礼品阵列中的每件礼品都是没有自己身份证明的子文件,我认为这是我理解/思考的地方。
我正在尝试使用RESTful界面提供应用功能。
POST
新的礼品清单,网址为/giftList/add
,其中请求正文为新礼品清单GET
个人礼品清单,包括儿童礼品,网址为/giftList/<listId>
- 例如:/giftList/55e9924848c4ffd723890b48
考虑到上述情况,我自然的下一步是能够标记一件礼物,可能是:
PUT
到网址/gift/claim/<giftId>
所以也许我的网址应该是:
/giftList/<listId>/claim/<giftId>
或者我可能尝试使用项目的描述
/gift/claim/<gift description>
例如:/gift/claim/Mongo+book
或者我可以参考礼品清单
/giftList/<listId>/claim/<gift description>
例如:/giftList/55e9924848c4ffd723890b48/claim/New+socks
或许我可以参考礼物的索引
/giftList/<listId>/claim/<gift index>
例如:/giftList/55e9924848c4ffd723890b48/claim/2
对我来说真正的感觉是我需要另一个系列,仅用于礼物,每个礼物文件都有自己的ID,然后我可以在我的RESTful网址中引用。并且礼物可以引用它的父亲GiftList,或者GiftList有一系列对礼物的引用 但这都是一种非常“关系”的思维方式......不是吗?
这样做的最佳方法是什么?或者,如果没有“最佳”方式,我的选择是什么?
答案 0 :(得分:1)
您可以使用新集合解决此问题,或者您可以为每个列表条目添加唯一标识符字段。用于唯一标识符的MongoDB解决方案正在生成ObjectId,就像用于_id
文档字段的解决方案一样。大多数MongoDB数据库驱动程序都应该公开生成ObjectId的功能。有关详细信息,请参阅数据库驱动程序的文档。