【问题标题】:Designing mongo 'schema' for RESTful application为 RESTful 应用程序设计 mongo 'schema'
【发布时间】:2015-12-15 14:12:41
【问题描述】:

我正在尝试通过编写应用程序来自学 mongo,并且我正在努力寻找设计 mongo 'schema' 的最佳方法(我知道它是无模式的,但这可能是我理解的核心问题我来自关系背景)

无论如何,该应用程序是一个礼物列表管理器,用户可以在其中创建一个礼物列表,并将他们想要收到的礼物添加到他们的列表中。其他用户可以订阅该列表,并且可以将礼物列表中的礼物标记为已领取/已购买。 (以免圣诞节收到重复礼物的问题!)

目前,我的 GiftLists 集合不是“关系型”,它只是 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 都是一个没有自己 id 的子文档,我认为这是我的理解/思考陷入困境的地方。

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

  • POST 一个新的礼物列表,网址是/giftList/add,其中请求正文是新的礼物列表
  • GET 包括儿童礼物在内的个人礼物列表的网址是/giftList/<listId> - 例如:/giftList/55e9924848c4ffd723890b48

考虑到上述情况,我的下一步自然是能够将礼物标记为已认领,也许是:

  • PUT 到网址/gift/claim/<giftId>
    但我在 Gift 子文档中没有任何 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 url 中引用它。并且 Gift 具有对其父 GiftList 的引用,或者 GiftList 具有对 Gifts 的引用数组
但这都是一种非常“关系”的思维方式……不是吗?

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

【问题讨论】:

    标签: mongodb rest database-schema nosql


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2011-03-20
    • 2013-09-12
    相关资源
    最近更新 更多