【问题标题】:Correcting database structure with MongoDB使用 MongoDB 更正数据库结构
【发布时间】:2012-05-24 07:32:59
【问题描述】:

我想用 MongoDB 创建一个相当简单的数据库结构。我的结构如下所示:

    {url: value,
     users: {user_id: value}}

示例文档可能如下所示:

{'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}}

我正在使用 PyMongo 更新我的数据库并添加文档,如上所示。我可以成功地将数据添加到我的数据库中,但我似乎无法复制上述数据结构。

    for d in data:
        foo.update(
            {'id': d.get('url')}, 
            {'$addToSet' :{'users': {d.get('user'): 'NaN'}}},
            upsert=True)

上面的代码插入,但“用户”结构不是我想要的。我想要:

users: {'billy': 'NaN', 'tommy': 'NaN'}

我得到:

users : [ { 'billy' : "NaN" }, { 'tommy' : "NaN" } ]

有人可以帮忙吗?感谢您的宝贵时间。

【问题讨论】:

  • 我不明白。你会得到一个很好的用户对象列表。问题出在哪里?
  • $addToSet 仅适用于数组,即lists,不适用于嵌入文档,即dicts。要执行您想要执行的操作,您必须编写 python 逻辑,因为没有更新操作可以使用 $set 执行 upsert。或者,您可以决定将users 放入一个数组中。
  • 好的,谢谢。那么在 Mongo 中,这种数据的最佳数据结构是什么?

标签: python mongodb pymongo


【解决方案1】:

根据我上面的评论,我建议不要嵌入文档,而是使用数组。以下方法效果很好:

{'url': 'http://stackoverflow.com/', 
 'users': [{'user': 'billy', 'value': 12},
           {'user': 'tommy', 'value': 2}}

通过这种方式,您可以利用$push$pull 等以及$addToSet。对于后者,您可以像这样添加一个新用户:

foo.update({'url': d.get('url')}, {'$addToSet': {'users': {'user': 'john', 'value': 0}}})

现在假设您只想为给定用户增加一个值,您也可以轻松地做到这一点:

foo.update({'url': d.get('url'), 'users.user': 'tommy'}, {'$inc': {'users.$.value': 1}})

要查看您可以使用我建议的架构做的更多事情,我会阅读this

【讨论】:

    【解决方案2】:

    我不太了解 mongo,但 $addToSet 建议存在用户集合,而您似乎需要将密钥添加到 users 对象。

    我不知道在 upsert 示例中是否有 mongo 快捷方式

    foo['users']['billy'] = 'NaN'

    【讨论】:

    • 是的,这正是我想做的。我也不太了解 Mongo,但我似乎找不到办法。
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2023-04-06
    • 2015-12-20
    • 2020-03-20
    相关资源
    最近更新 更多