django 怎么查询mongodb数据

django 怎么查询mongodb数据,第1张

清单 1 您可以尝试对 MongoDB 使用的样例 JavaScript 命令

var x = "0";

x === 0;

typeof({});

您不必成为一名 JavaScript 专家之后才开始使用 MongoDB;这里提供几个有用的概念:

您可以使用对象字面量语法 (object literal syntax) 创建对象,换句话说,会使用两个花括号(如 var myCollection = {};)。

您可以使用方括号([])来创建数组。

除了数字、布尔值、null 和未定义值以外,JavaScript 中的其他所有值都是一个对象。

如果您想要了解关于 JavaScript 其他特性的更多信息,比如原型的面向对象的编程 (OOP)、范围规则,及其函数式编程特性,请参阅 参考资料。

MongoDB 是一种无模式数据库,与关系型数据库完全相反。无模式数据库没有使用表格,而是使用由文档组成的集合。这些文档是使用对象字面量语法创建的,如 清单 2 所示。

清单 2 文档创建示例

var person1 = {name:"John Doe", age:25};

var person2 = {name:"Jane Doe", age:26, dept: 115};

现在,请执行 清单 3 中所示的命令来创建一个新集合。

清单 3 创建集合

dbemployeessave(person1);

dbemployeessave(person2);

由于 MongoDB 具有无模式特性,所以 person1 和 person2 不必具有相同的列类型,甚至不必拥有相同的列编号。并且,MongoDB 本身具有动态特性,所以它会创建 employees 而不是抛出一个错误。您可以通过 find() 方法检索文档。要获取 employees 中的所有文档,可以直接调用 find(),无需使用任何参数,如 清单 4 所示。

清单 4 一个简单的 MongoDB 查询

> dbemployeesfind();

// returns

[

{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },

"name" : "John Doe", "age" : 25 },

{ "_id" : { "$oid" : "4e363c53cc93747e68055fa2" },

"name" : "Jane Doe", "dept" : 115, "age" : 26 }

]

注意,_id 等效于一个主键。要运行具体的查询,则需要使用键/值对传递另一个对象来指示您所要查询的内容,如 清单 5 所示。

清单 5 通过一个搜索参数进行查询

> dbemployeesfind({name: "John Doe"});

// returns

[

{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },

"name" : "John Doe", "age" : 25 }

]

要查询年龄大于 25 岁的员工,请执行 清单 6 中的命令。

清单 6 查询年龄大于 25 岁的员工

> dbemployeesfind({age:{'$gt':25}});

// returns

[

{ "_id" : { "$oid" : "4e363c53cc93747e68055fa2" },

"name" : "Jane Doe", "dept" : 115, "age" : 26 }

]

$gt 是一个特殊 *** 作符,表示大于。表 1 列出了其他修饰符。

表 1 可以对 MongoDB 使用的修饰符

修饰符

描述

$gt 大于

$lt 小于

$gte 大于或等于

$lte 小于或等于

$in 检查某个数组是否存在,类似于 'in' SQL *** 作符。

当然,您也可以使用 update() 方法更新记录。您可以更新整条记录,如 清单 7 所示。

清单 7 更新整条记录

> dbemployeesupdate({

name:"John Doe", // Document to update

{name:"John Doe", age:27} // updated document

});

此外,您还可以使用 $set *** 作符仅更新一个值,如 清单 8 所示。

清单 8 仅更新记录中的一个值

> dbemployeesupdate({name:"John Doe",

{ '$set': {age:27} }

});

要清空集合,可以调用 remove() 方法,无需使用任何参数。例如,如果您想要从 employees 集合中移除 John Doe,那么您可以执行 清单 9所示的 *** 作。

清单 9 从 employees 集合中移除 John Doe

> dbemployeesremove({"name":"John Doe"});

> dbemployeesfind();

// returns

[

{ "_id" : { "$oid" : "4e363c53cc93747e68055fa2" }, "name" : "Jane Doe",

"dept" : 115, "age" : 26 }

]

此内容对于刚开始使用 MongoDB 的您来说已经足够了。当然,您可以继续浏览官方网站,该网站提供了简洁的、基于 Web 的交互式 mongodb 命令提示符,以及指南和官方文档。请参阅 参考资料。

回页首

将 Django 与 MongoDB 集成

有几个从 Python 或 Django 访问 MongoDB 的选项。第一个选项是使用 Python 模块,即 PyMongo。清单 10 是一个简单的 PyMongo 会话,假设您已经安装了 MongoDB,并且已经拥有一个在端口上运行的实例。

清单 10 样例 PyMongo 会话

from pymongo import Connection

databaseName = "sample_database"

connection = Connection()

db = connection[databaseName]

employees = db['employees']

person1 = { "name" : "John Doe",

"age" : 25, "dept": 101, "languages":["English","German","Japanese"] }

person2 = { "name" : "Jane Doe",

"age" : 27, "languages":["English","Spanish","French"] }

print "clearing"

employeesremove()

print "saving"

employeessave(person1)

employeessave(person2)

print "searching"

for e in employeesfind():

print e["name"] + " " + unicode(e["languages"])

PyMongo 允许您同时运行多个数据库。要定义一个连接,只需将数据库名字传递给连接实例。在本例中,Python 词典代替了 JavaScript 对象字面量来创建新文档定义,而 Python 列表代替了 JavaScript 数组。find 方法会返回一个您可以进行迭代的数据库游标对象。

语法的简易性使 MongoDB 命令行与包含 PyMongo 的运行命令之间的切换变得容易。例如,清单 11 展示了如何使用 PyMongo 运行一个查询。

清单 11 使用 PyMongo 运行一个查询

for e in employeesfind({"name":"John Doe"}):

print e

您从 Python 调用 MongoDB 的另一个选项是 MongoEngine,如果您使用过 Django 的内置 ORM,那么您对此应该感到非常熟悉。MongoEngine 是一个文档到对象的映射器,从概念上说,它与映射到 ORM 的映射器类似。清单 12 显示了一个使用 MongoEngine 的示例会话。

清单 12 MongoEngine 示例会话

from mongoengine import

connect('employeeDB')

class Employee(Document):

name = StringField(max_length=50)

age = IntField(required=False)

john = Employee(name="John Doe", age=25)

johnsave()

jane = Employee(name="Jane Doe", age=27)

janesave()

for e in Employeeobjectsall():

print e["id"], e["name"], e["age"]

Employee 对象继承自 mongoengineDocument。在本示例中,使用了两种字段类型:StringField 和 IntField。与 Django 的 ORM 相似,要通过查询获得集合中的所有文档,请调用 Employeeobjectsall()。请注意,要访问惟一的对象 ID,请使用 "id" 而非 "_id"。

回页首

一个样例博客

现在要创建一个名为 Blongo 的简单博客。您将使用 Python 17、Django 13、MongoDB 182、MongoEngine 04 和 Hypertext Markup Language (HTML) 5。如果您想要重现我的精确设置,我习惯使用 Ubuntu Linux 和 FireFox。Blongo 在网页加载后就会显示所输入的所有博客条目,并且允许对任何条目执行更新和删除 *** 作,换句话说,允许进行所有的标准 CRUD *** 作。Django 视图拥有三个方法:index、update 和delete。

层叠样式表 (CSS) 定义被引入一个单独的静态文件。相关内容我不想在此处赘述,您可以随意浏览 下载 部分中包含的源代码

假设已安装好所需的所有工具,并且这些组件都能良好运行,那么请创建一个新的 Django 项目和必要的组件,如 清单 13 所示。

清单 13 创建 Django 博客项目的命令

$ django-adminpy startproject blongo

$ cd blongo

$ django-adminpy startapp blogapp

$ mkdir templates

$ cd blogapp

$ mkdir static

Django 13 的新增内容是一个已包含在 Django 中的贡献型应用程序,可使用它来改进静态文件的处理。通过向任何应用程序目录添加一个静态目录(例如,本例中的 blogapp)并确保 djangocontribstaticfiles 包含在已安装应用程序中,Django 可以查找到诸如 css 和 js 的静态文件,而无需使用其他任何方法。清单 14 显示了设置文件的代码行,这些代码行已经进行了相应修改(来自默认的 settingspy 文件),使博客应用程序能够正常运行。

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。它的特点是高性能、易部署、易使用,存储数据非常方便。

MongoDB 简单使用

联接数据库

复制代码代码如下:

In [1]: import pymongo

In [2]: from pymongo import Connection

In [3]: connection = Connection('19216813', 27017) //创建联接

Connection 相关参数

复制代码代码如下:

Connection([host='localhost'[, port=27017[, pool_size=None[, auto_start_request=None[, timeout=None[, slave_okay=False[, network_timeout=None[, document_class=dict[, tz_aware=True]]]]]]]]])

数据库 *** 作

复制代码代码如下:

In [9]: cdatabase_names() //列出所有数据库名称

Out[9]: [u'test', u'admin', u'yuhen', u'sms', u'local']

In [10]: cserver_info() //查看服务器相关信息

Out[10]:

{u'bits': 64,

u'gitVersion': u'nogitversion',

u'ok': 10,

u'sysInfo': u'Linux yellow 2624-27-server #1 SMP Fri Mar 12 01:23:09 UTC 2010 x86_64 BOOST_LIB_VERSION=1_40',

u'version': u'122'}

In [16]: db = c['test'] //选择数据库

In [17]: dbcollection_names() //列出当前数据库中所有集合名称

Out[17]: [u'systemindexes', u'fsfiles', u'fschunks', u'test_gao']

In [23]: dbconnection //查看联接信息

Out[23]: Connection('19216813', 27017)

In [24]: dbcreate_collection('test_abeen') //创建新集合

Out[24]: Collection(Database(Connection('19216813', 27017), u'test'), u'test_abeen')

In [25]: dblast_status() //查看上次 *** 作状态

Out[25]: {u'err': None, u'n': 0, u'ok': 10}

In [26]: dbname //查看当前数据库名称

Out[26]: u'test'

In [27]: dbprofiling_info() //查看配置信息

Out[27]: []

In [28]: dbprofiling_level()

Out[28]: 00

集合 *** 作

复制代码代码如下:

In [31]: dbcollection_names() //查看当前数据库所有集合名称

Out[31]:

[u'systemindexes',

u'fsfiles',

u'fschunks',

u'test_gao',

u'systemusers',

u'test_abeen']

In [32]: c = dbtest_abeen //选择集合

In [33]: cname //查看当前集合名称

Out[33]: u'test_abeen'

In [35]: cfull_name //查看当前集合全名

Out[35]: u'testtest_abeen'

In [36]: cdatabase //查看当前集合数据库相关信息

Out[36]: Database(Connection('19216813', 27017), u'test')

In [38]: post = {"author":"Mike","text":"this is a test by abeen"}

In [39]: posts = dbposts

In [40]: postsinsert(post) //向数据库集合插入文档,默认创建集合

Out[40]: ObjectId('4c358492421aa91e70000000')

In [41]: dbcollection_names() //显示所有集合名称

Out[41]:

[u'systemindexes',

u'fsfiles',

u'fschunks',

u'test_gao',

u'systemusers',

u'test_abeen',

u'posts']

In [42]: postsfind_one() //从集合查找信息

Out[42]:

{u'_id': ObjectId('4c358492421aa91e70000000'),

u'author': u'Mike',

u'text': u'this is a test by abeen'}

In [52]: pupdate({"author":"Mike"},{"$set":{"author":"abeen","text":"this is a test by abeen shan shan"}})//更新集合文档信息

In [55]: list(pfind())

Out[55]:

[{u'_id': ObjectId('4c358492421aa91e70000000'),

u'author': u'abeen',

u'text': u'this is a test by abeen shan shan'}]

In [96]: list(postsfind())

Out[96]:

[{u'_id': ObjectId('4c358492421aa91e70000000'),

u'author': u'Mike',

u'text': u'this is a test by abeen'},

{u'_id': ObjectId('4c358ad4421aa91e70000002'), u'a': u'aa', u'b': u'bb'},

{u'_id': ObjectId('4c358ad9421aa91e70000003'), u'a': u'aa', u'b': u'bb'},

{u'_id': ObjectId('4c358abb421aa91e70000001'),

u'a': u'abeen',

u'b': u'this bb is updated'}]

In [97]: postsremove({"a":"abeen"}) //删除符合条件的文档

In [98]: list(postsfind())

Out[98]:

[{u'_id': ObjectId('4c358492421aa91e70000000'),

u'author': u'Mike',

u'text': u'this is a test by abeen'},

{u'_id': ObjectId('4c358ad4421aa91e70000002'), u'a': u'aa', u'b': u'bb'},

{u'_id': ObjectId('4c358ad9421aa91e70000003'), u'a': u'aa', u'b': u'bb'}]

In [102]: dbcollection_names()

Out[102]:

[u'systemindexes',

u'fsfiles',

u'fschunks',

u'test_gao',

u'systemusers',

u'test_abeen',

u'posts',

u'doc_abeen']

In [104]: dbdrop_collection("doc_abeen") //删除集合

In [105]: dbcollection_names()

Out[105]:

[u'systemindexes',

u'fsfiles',

u'fschunks',

u'test_gao',

u'systemusers',

u'test_abeen',

u'posts']

代码

复制代码代码如下:

In [113]: result = dbpostsfind({"a":"aa"})//查找

In [114]: type(result)

Out[114]: <class 'pymongocursorCursor'>

In [119]: list(result)

Out[119]:

[{u'_id': ObjectId('4c358ad4421aa91e70000002'), u'a': u'aa', u'b': u'bb'},

{u'_id': ObjectId('4c358ad9421aa91e70000003'), u'a': u'aa', u'b': u'bb'}]

find格式

复制代码代码如下:

find([spec=None[, fields=None[, skip=0[, limit=0[, timeout=True[, snapshot=False[, tailable=False[, sort=None[, max_scan=None[, as_class=None[, kwargs]]]]]]]]]]])

代码

复制代码代码如下:

In [120]: dbpostscount()//当前集合文档数

Out[120]: 3

In [121]: type(dbposts)

Out[121]: <class 'pymongocollectionCollection'>

In [138]: postsrename('test_abeen')//重命名当前集合

In [139]: dbcollection_names()

Out[139]:

[u'systemindexes',

u'fsfiles',

u'fschunks',

u'test_gao',

u'systemusers',

u'test_abeen']

In [151]: for post in cfind({"a":"aa"})sort("a"): //查询并排序列

post

Out[152]: {u'_id': ObjectId('4c358ad4421aa91e70000002'), u'a': u'aa', u'b': u'bb'}

Out[152]: {u'_id': ObjectId('4c358ad9421aa91e70000003'), u'a': u'aa', u'b': u'bb'}

复制代码代码如下:

> dbfooinsert( { x : 1, y : 1 } )

> dbfooinsert( { x : 2, y : "string" } )

> dbfooinsert( { x : 3, y : null } )

> dbfooinsert( { x : 4 } )

// Query #1 y 为null或不存在

> dbfoofind( { "y" : null } )

{ "_id" : ObjectId("4dc1975312c677fc83b5629f"), "x" : 3, "y" : null }

{ "_id" : ObjectId("4dc1975a12c677fc83b562a0"), "x" : 4 }

// Query #2 y为null的值

> dbfoofind( { "y" : { $type : 10 } } )

{ "_id" : ObjectId("4dc1975312c677fc83b5629f"), "x" : 3, "y" : null }

// Query #3 y不存在的结果

> dbfoofind( { "y" : { $exists : false } } )

{ "_id" : ObjectId("4dc1975a12c677fc83b562a0"), "x" : 4 }

清单 1 您可以尝试对 MongoDB 使用的样例 JavaScript 命令var x = "0";

x === 0;

typeof({});

您不必成为一名 JavaScript 专家之后才开始使用 MongoDB;这里提供几个有用的概念:

您可以使用对象字面量语法 (object literal syntax) 创建对象,换句话说,会使用两个花括号(如 var myCollection = {};)。

您可以使用方括号([])来创建数组。

除了数字、布尔值、null 和未定义值以外,JavaScript 中的其他所有值都是一个对象。

如果您想要了解关于 JavaScript 其他特性的更多信息,比如原型的面向对象的编程 (OOP)、范围规则,及其函数式编程特性,请参阅 参考资料。

MongoDB 是一种无模式数据库,与关系型数据库完全相反。无模式数据库没有使用表格,而是使用由文档组成的集合。这些文档是使用对象字面量语法创建的,如 清单 2 所示。

清单 2 文档创建示例

var person1 = {name:"John Doe", age:25};

var person2 = {name:"Jane Doe", age:26, dept: 115};

现在,请执行 清单 3 中所示的命令来创建一个新集合。

清单 3 创建集合

dbemployeessave(person1);

dbemployeessave(person2);

以上就是关于django 怎么查询mongodb数据全部的内容,包括:django 怎么查询mongodb数据、python3 mongodb怎么实现关联查询、如何判断pymongo 查询为空等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9485435.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存