用MongoDB修正数据库结构

2024-05-12 21:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当直接的数据库结构,我想用MongoDB创建。我的结构是这样的:

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

示例文档可能如下所示:

^{pr2}$

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

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

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

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

我得到:

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

有人能帮忙吗?谢谢你的时间。在


Tags: 文档id数据库url示例getvaluemongodb
2条回答

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

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

这样您就可以利用$push$pull等以及$addToSet。对于后者,您可以添加如下新用户:

^{pr2}$

现在假设您只想为给定用户增加一个值,您也可以很容易地做到:

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

要想了解更多关于我提出的模式可以做的事情,我将阅读this

我对mongo不是很了解,但是$addToSet建议有一个用户集合,而你似乎需要将密钥添加到users对象。在

我不知道在upsert的例子中是否有mongo的捷径

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

相关问题 更多 >