我想用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" } ]
有人可以帮忙吗?谢谢你的时间。
答案 0 :(得分:2)
根据我上面的评论,我建议不要嵌入文档,而是使用数组。以下方法效果很好:
{'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
答案 1 :(得分:0)
我不太了解mongo,但$addToSet
建议有一组用户,而不是看起来你需要将密钥添加到用户对象。
我不知道在upsert示例中是否有mongo快捷方式
foo['users']['billy'] = 'NaN'