Python 用MongoDB纠正数据库结构

Python 用MongoDB纠正数据库结构,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一个非常简单的数据库结构,我想用MongoDB创建。我的结构如下所示: {url: value, users: {user_id: value}} {'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}} foo.update({'url': d.get('url')}, {'$addToSet': {'users': {'user': 'john', 'value': 0}}}) 示

我有一个非常简单的数据库结构,我想用MongoDB创建。我的结构如下所示:

    {url: value,
     users: {user_id: value}}
{'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}}
foo.update({'url': d.get('url')}, {'$addToSet': {'users': {'user': 'john', 'value': 0}}})
示例文档可能如下所示:

    {url: value,
     users: {user_id: value}}
{'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}}
foo.update({'url': d.get('url')}, {'$addToSet': {'users': {'user': 'john', 'value': 0}}})
我正在使用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" } ]

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

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

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


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

根据我上面的评论,我建议不要嵌入文档,而是使用数组。以下措施将很有效:

{'url': 'http://stackoverflow.com/', 
 'users': [{'user': 'billy', 'value': 12},
           {'user': 'tommy', 'value': 2}}
通过这种方式,您可以利用
$push
$pull
等以及
$addToSet
。对于后者,您可以添加如下新用户:

    {url: value,
     users: {user_id: value}}
{'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}}
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}})

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

我不明白。你会得到一个很好的用户对象列表。问题出在哪里?
$addToSet
仅适用于数组,即
列表,而不适用于嵌入文档,即
dict
s。要执行您想要执行的操作,您必须为其编写python逻辑,因为没有可以使用
$set
执行upsert的更新操作。或者,您可以决定将
用户
放入一个数组。好的,谢谢。那么,Mongo中这些数据的最佳数据结构是什么呢?是的,这正是我想要做的。我也不太了解Mongo,但我似乎找不到一个方法来做到这一点。