为RESTful应用程序设计mongo'schema'

时间:2015-09-18 12:15:27

标签: mongodb rest database-schema nosql

我正在尝试通过编写应用程序来教自己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>
    但我对礼物子文件没有任何ID

所以也许我的网址应该是:

  • /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
    但我声称的“新袜子”是哪种情况? (毕竟,每个人在圣诞节都需要很多新袜子!)

或许我可以参考礼物的索引

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

对我来说真正的感觉是我需要另一个系列,仅用于礼物,每个礼物文件都有自己的ID,然后我可以在我的RESTful网址中引用。并且礼物可以引用它的父亲GiftList,或者GiftList有一系列对礼物的引用 但这都是一种非常“关系”的思维方式......不是吗?

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

1 个答案:

答案 0 :(得分:1)

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