Skip to content

Instantly share code, notes, and snippets.

@luw2007
Last active August 29, 2015 14:13
Show Gist options
  • Select an option

  • Save luw2007/2dbc60ce26507ad74606 to your computer and use it in GitHub Desktop.

Select an option

Save luw2007/2dbc60ce26507ad74606 to your computer and use it in GitHub Desktop.
介绍mongodb auto reference , 在线访问 http://nbviewer.ipython.org/2dbc60ce26507ad74606
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:c1b8cbef23ad4b6870c2ded2f4c77ad5e80b662492d13dc0e6f014b3cc95bbe0"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u4ecb\u7ecdmongodb auto reference\n",
"# author: luw2007@gmai.com\n",
"# \u8bf7\u5728\u672c\u5730\u6d4b\u8bd5\u73af\u5883\u4e0a\u4f7f\u7528"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from pymongo import MongoClient\n",
"from pymongo.son_manipulator import AutoReference, NamespaceInjector\n",
"from bson import DBRef\n",
"\n",
"DB_NAME = 'test'\n",
"PEOPLE_TABLE = 'people'\n",
"MSG_TABLE = 'msg'\n",
"\n",
"# \u6ca1\u6709\u6dfb\u52a0\u81ea\u52a8\u5f15\u7528\u7684\u8868, \u65b9\u4fbf\u67e5\u8be2\u539f\u59cb\u7684\u6570\u636e\n",
"no_reference_db = MongoClient()[DB_NAME]\n",
"raw_people = no_reference_db[PEOPLE_TABLE]\n",
"raw_msg = no_reference_db[MSG_TABLE]\n",
"\n",
"# \u6e05\u7a7a\u5386\u53f2\u6570\u636e\n",
"_ = raw_people.remove()\n",
"_ = raw_msg.remove()\n",
"\n",
"# \u8fde\u63a5\u5230\u672c\u5730\u7684mongodb, \u5e76\u6253\u5f00\u81ea\u52a8\u5f15\u7528\n",
"db = MongoClient()[DB_NAME]\n",
"db.add_son_manipulator(AutoReference(db))\n",
"db.add_son_manipulator(NamespaceInjector())\n",
"people = db[PEOPLE_TABLE]\n",
"msg = db[MSG_TABLE]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u65b0\u589e\n",
"peter = {'name': 'peter'}\n",
"john = {'name': 'john'}\n",
"marry = {'name': 'marry'}\n",
"huangz = {'name': 'huangz', 'friends': [peter, john, marry]}\n",
"\n",
"people.insert([peter, john, marry, huangz])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"[ObjectId('54b7544e5b6d6e59c68eb972'),\n",
" ObjectId('54b7544e5b6d6e59c68eb973'),\n",
" ObjectId('54b7544e5b6d6e59c68eb974'),\n",
" ObjectId('54b7544e5b6d6e59c68eb975')]"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u5f00\u542f\u81ea\u52a8\u5f15\u7528\u540e, \u4f1a\u589e\u52a0 ``{'_ns': 'people'}``\n",
"print(peter)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{'_ns': u'people', '_id': ObjectId('54b7544e5b6d6e59c68eb972'), 'name': 'peter'}\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u5bf9\u6bd4\u5f00\u542f\u81ea\u52a8\u5f15\u7528\u524d\u540e\u6570\u636e\u5dee\u5f02\n",
"# \u6570\u636e\u5e93\u4e2d\u662f DBRef\u7c7b\u578b\u7684\u5b57\u6bb5, \u81ea\u52a8\u5f15\u7528\u540e\u5c06\"DERef\" \u8f6c\u6362\u6210\u5bf9\u5e94\u7684\u771f\u5b9e\u5b57\u6bb5\n",
"\n",
"#\u5728\u6570\u636e\u5e93\u4e2d \n",
"raw_people.find_one({'name': 'huangz'})['friends'][0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"DBRef(u'people', ObjectId('54b7544e5b6d6e59c68eb972'))"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u81ea\u52a8\u5f15\u7528\u540e \n",
"huangz['friends'][0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"{'_id': ObjectId('54b7544e5b6d6e59c68eb972'),\n",
" '_ns': u'people',\n",
" 'name': 'peter'}"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u641c\u7d22DBRef \u5b57\u6bb5\n",
"people.find_one({'friends': DBRef(PEOPLE_TABLE, peter['_id'])}, {'name': 1})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"SON([(u'_id', ObjectId('54b7544e5b6d6e59c68eb975')), (u'name', u'huangz')])"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u5220\u9664 use $pull \u5220\u9664\u6389\u6570\u7ec4\u4e2d\u7684DBRef\n",
"peter_ref = DBRef(PEOPLE_TABLE, peter['_id'])\n",
"people.update({'friends': peter_ref}, {'$pull': {'friends': peter_ref}})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"{u'n': 1, u'nModified': 1, u'ok': 1, 'updatedExisting': True}"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u67d0\u6761\u6570\u636e\u4e2d\u5373\u4f7f\u6709\u81ea\u52a8\u5f15\u7528, \u8fd9\u6761\u6570\u636e\u4f9d\u7136\u662f\u666e\u901a\u7684mongodb\u6570\u636e. \u76f4\u63a5\u4f7f\u7528remove \u5c31\u53ef\u4ee5\u5220\u9664\n",
"people.remove(marry)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"{u'n': 1, u'ok': 1}"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"'''\u7531\u4e8emongodb \u4e0d\u63d0\u4f9b\u4e8b\u52a1, \u800c\u4e14\u76ee\u524d\u81ea\u52a8\u5f15\u7528\u4e0d\u63d0\u4f9b\u5173\u8054\u5220\u9664\u529f\u80fd\n",
"\u6240\u4ee5\u81ea\u52a8\u5f15\u7528\u4e2d\u7684\u5bf9\u8c61\u5220\u9664\u4e86, \u5f00\u542f\u81ea\u52a8\u5f15\u7528\u540e\u4f1a\u663e\u793aNone, \u56e0\u6b64\u5220\u9664\u65f6\u9700\u8981\u81ea\u884c\u5904\u7406\u5f15\u7528\u7684\u60c5\u51b5.'''\n",
"\n",
"print('haungz \u4e2d\u4e0d\u4f1a\u81ea\u52a8\u5220\u9664 friends\u4e2d\u7684marry\u5b57\u6bb5, \\n\u7531 %r \u53d8\u6210 %r' % (\n",
" huangz['friends'][-1], \n",
" people.find_one({'_id': huangz['_id']})['friends'][-1])\n",
" )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"haungz \u4e2d\u4e0d\u4f1a\u81ea\u52a8\u5220\u9664 friends\u4e2d\u7684marry\u5b57\u6bb5, \n",
"\u7531 {'_ns': u'people', '_id': ObjectId('54b7544e5b6d6e59c68eb974'), 'name': 'marry'} \u53d8\u6210 None\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u624b\u5de5\u5220\u9664\u6389 friends \u4e2d\u7684 'marry', \u91cd\u65b0\u4fdd\u5b58\n",
"huangz['friends'].pop()\n",
"people.save(huangz)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"ObjectId('54b7544e5b6d6e59c68eb975')"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u6b64\u65f6\u6570\u636e\u4e2d\u5df2\u7ecf\u6ca1\u6709marry\n",
"people.find_one({'_id': huangz['_id']})['friends']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"[SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb972')), (u'name', u'peter')]),\n",
" SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb973')), (u'name', u'john')])]"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u8de8\u8868\n",
"msg.insert([{'from': huangz, 'to': peter, 'message': 'from hangz to peter'}, \n",
" {'from': huangz, 'to': john, 'message': 'from hangz to john'},\n",
" {'from': huangz, 'to': marry, 'message': 'from hangz to marry'}])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"[ObjectId('54b754535b6d6e59c68eb976'),\n",
" ObjectId('54b754535b6d6e59c68eb977'),\n",
" ObjectId('54b754535b6d6e59c68eb978')]"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u81ea\u52a8\u5904\u7406\u5f15\u7528\u524d\n",
"'''\u6ce8\u610ffrom, to \u5b57\u6bb5'''\n",
"raw_msg.find_one({'to': DBRef(PEOPLE_TABLE, peter['_id'])})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"{u'_id': ObjectId('54b754535b6d6e59c68eb976'),\n",
" u'_ns': u'msg',\n",
" u'from': DBRef(u'people', ObjectId('54b7544e5b6d6e59c68eb975')),\n",
" u'message': u'from hangz to peter',\n",
" u'to': DBRef(u'people', ObjectId('54b7544e5b6d6e59c68eb972'))}"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# \u81ea\u52a8\u5904\u7406\u5f15\u7528\u540e\n",
"to_peter = msg.find_one({'to': DBRef(PEOPLE_TABLE, peter['_id'])})\n",
"print(to_peter)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"SON([(u'to', SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb972')), (u'name', u'peter')])), (u'message', u'from hangz to peter'), (u'_id', ObjectId('54b754535b6d6e59c68eb976')), (u'from', SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb975')), (u'friends', [SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb972')), (u'name', u'peter')]), SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb973')), (u'name', u'john')])]), (u'name', u'huangz')])), (u'_ns', u'msg')])\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"'''\u6ce8\u610f from.friends \u5b57\u6bb5\u4e5f\u4f1a\u88ab\u81ea\u52a8\u5f15\u7528'''\n",
"to_peter['from']['friends']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"[SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb972')), (u'name', u'peter')]),\n",
" SON([(u'_ns', u'people'), (u'_id', ObjectId('54b7544e5b6d6e59c68eb973')), (u'name', u'john')])]"
]
}
],
"prompt_number": 16
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment