Last active
August 29, 2015 14:13
-
-
Save luw2007/2dbc60ce26507ad74606 to your computer and use it in GitHub Desktop.
介绍mongodb auto reference , 在线访问 http://nbviewer.ipython.org/2dbc60ce26507ad74606
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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