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. 创建集合
db.employees.save(person1);
db.employees.save(person2);
由于 MongoDB 具有无模式特性,所以 person1 和 person2 不必具有相同的列类型,甚至不必拥有相同的列编号。并且,MongoDB 本身具有动态特性,所以它会创建 employees 而不是抛出一个错误。您可以通过 find() 方法检索文档。要获取 employees 中的所有文档,可以直接调用 find(),无需使用任何参数,如 清单 4 所示。
清单 4. 一个简单的 MongoDB 查询
> db.employees.find();
// returns
[
{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },
"name" : "John Doe", "age" : 25 },
{ "_id" : { "$oid" : "4e363c53cc93747e68055fa2" },
"name" : "Jane Doe", "dept" : 115, "age" : 26 }
]
注意,_id 等效于一个主键。要运行具体的查询,则需要使用键/值对传递另一个对象来指示您所要查询的内容,如 清单 5 所示。
清单 5. 通过一个搜索参数进行查询
> db.employees.find({name: "John Doe"});
// returns
[
{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },
"name" : "John Doe", "age" : 25 }
]
要查询年龄大于 25 岁的员工,请执行 清单 6 中的命令。
清单 6. 查询年龄大于 25 岁的员工
> db.employees.find({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. 更新整条记录
> db.employees.update({
name:"John Doe", // Document to update
{name:"John Doe", age:27} // updated document
});
此外,您还可以使用 $set 操作符仅更新一个值,如 清单 8 所示。
清单 8. 仅更新记录中的一个值
> db.employees.update({name:"John Doe",
{ '$set': {age:27} }
});
要清空集合,可以调用 remove() 方法,无需使用任何参数。例如,如果您想要从 employees 集合中移除 John Doe,那么您可以执行 清单 9所示的操作。
清单 9. 从 employees 集合中移除 John Doe
> db.employees.remove({"name":"John Doe"});
> db.employees.find();
// 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"
employees.remove()
print "saving"
employees.save(person1)
employees.save(person2)
print "searching"
for e in employees.find():
print e["name"] + " " + unicode(e["languages"])
PyMongo 允许您同时运行多个数据库。要定义一个连接,只需将数据库名字传递给连接实例。在本例中,Python 词典代替了 JavaScript 对象字面量来创建新文档定义,而 Python 列表代替了 JavaScript 数组。find 方法会返回一个您可以进行迭代的数据库游标对象。
语法的简易性使 MongoDB 命令行与包含 PyMongo 的运行命令之间的切换变得容易。例如,清单 11 展示了如何使用 PyMongo 运行一个查询。
清单 11. 使用 PyMongo 运行一个查询
for e in employees.find({"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)
john.save()
jane = Employee(name="Jane Doe", age=27)
jane.save()
for e in Employee.objects.all():
print e["id"], e["name"], e["age"]
Employee 对象继承自 mongoengine.Document。在本示例中,使用了两种字段类型:StringField 和 IntField。与 Django 的 ORM 相似,要通过查询获得集合中的所有文档,请调用 Employee.objects.all()。请注意,要访问惟一的对象 ID,请使用 "id" 而非 "_id"。
回页首
一个样例博客
现在要创建一个名为 Blongo 的简单博客。您将使用 Python 1.7、Django 1.3、MongoDB 1.8.2、MongoEngine 0.4 和 Hypertext Markup Language (HTML) 5。如果您想要重现我的精确设置,我习惯使用 Ubuntu Linux 和 FireFox。Blongo 在网页加载后就会显示所输入的所有博客条目,并且允许对任何条目执行更新和删除操作,换句话说,允许进行所有的标准 CRUD 操作。Django 视图拥有三个方法:index、update 和delete。
层叠样式表 (CSS) 定义被引入一个单独的静态文件。相关内容我不想在此处赘述,您可以随意浏览 下载 部分中包含的源代码。
假设已安装好所需的所有工具,并且这些组件都能良好运行,那么请创建一个新的 Django 项目和必要的组件,如 清单 13 所示。
清单 13. 创建 Django 博客项目的命令
$ django-admin.py startproject blongo
$ cd blongo
$ django-admin.py startapp blogapp
$ mkdir templates
$ cd blogapp
$ mkdir static
Django 1.3 的新增内容是一个已包含在 Django 中的贡献型应用程序,可使用它来改进静态文件的处理。通过向任何应用程序目录添加一个静态目录(例如,本例中的 blogapp)并确保 django.contrib.staticfiles 包含在已安装应用程序中,Django 可以查找到诸如 .css 和 .js 的静态文件,而无需使用其他任何方法。清单 14 显示了设置文件的代码行,这些代码行已经进行了相应修改(来自默认的 settings.py 文件),使博客应用程序能够正常运行。
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. 创建集合
db.employees.save(person1);
db.employees.save(person2);
由于 MongoDB 具有无模式特性,所以 person1 和 person2 不必具有相同的列类型,甚至不必拥有相同的列编号。并且,MongoDB 本身具有动态特性,所以它会创建 employees 而不是抛出一个错误。您可以通过 find() 方法检索文档。要获取 employees 中的所有文档,可以直接调用 find(),无需使用任何参数,如 清单 4 所示。
清单 4. 一个简单的 MongoDB 查询
> db.employees.find();
// returns
[
{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },
"name" : "John Doe", "age" : 25 },
{ "_id" : { "$oid" : "4e363c53cc93747e68055fa2" },
"name" : "Jane Doe", "dept" : 115, "age" : 26 }
]
注意,_id 等效于一个主键。要运行具体的查询,则需要使用键/值对传递另一个对象来指示您所要查询的内容,如 清单 5 所示。
清单 5. 通过一个搜索参数进行查询
> db.employees.find({name: "John Doe"});
// returns
[
{ "_id" : { "$oid" : "4e363c4dcc93747e68055fa1" },
"name" : "John Doe", "age" : 25 }
]
要查询年龄大于 25 岁的员工,请执行 清单 6 中的命令。
清单 6. 查询年龄大于 25 岁的员工
> db.employees.find({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. 更新整条记录
> db.employees.update({
name:"John Doe", // Document to update
{name:"John Doe", age:27} // updated document
});
此外,您还可以使用 $set 操作符仅更新一个值,如 清单 8 所示。
清单 8. 仅更新记录中的一个值
> db.employees.update({name:"John Doe",
{ '$set': {age:27} }
});
要清空集合,可以调用 remove() 方法,无需使用任何参数。例如,如果您想要从 employees 集合中移除 John Doe,那么您可以执行 清单 9所示的操作。
清单 9. 从 employees 集合中移除 John Doe
> db.employees.remove({"name":"John Doe"});
> db.employees.find();
// 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"
employees.remove()
print "saving"
employees.save(person1)
employees.save(person2)
print "searching"
for e in employees.find():
print e["name"] + " " + unicode(e["languages"])
PyMongo 允许您同时运行多个数据库。要定义一个连接,只需将数据库名字传递给连接实例。在本例中,Python 词典代替了 JavaScript 对象字面量来创建新文档定义,而 Python 列表代替了 JavaScript 数组。find 方法会返回一个您可以进行迭代的数据库游标对象。
语法的简易性使 MongoDB 命令行与包含 PyMongo 的运行命令之间的切换变得容易。例如,清单 11 展示了如何使用 PyMongo 运行一个查询。
清单 11. 使用 PyMongo 运行一个查询
for e in employees.find({"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)
john.save()
jane = Employee(name="Jane Doe", age=27)
jane.save()
for e in Employee.objects.all():
print e["id"], e["name"], e["age"]
Employee 对象继承自 mongoengine.Document。在本示例中,使用了两种字段类型:StringField 和 IntField。与 Django 的 ORM 相似,要通过查询获得集合中的所有文档,请调用 Employee.objects.all()。请注意,要访问惟一的对象 ID,请使用 "id" 而非 "_id"。
回页首
一个样例博客
现在要创建一个名为 Blongo 的简单博客。您将使用 Python 1.7、Django 1.3、MongoDB 1.8.2、MongoEngine 0.4 和 Hypertext Markup Language (HTML) 5。如果您想要重现我的精确设置,我习惯使用 Ubuntu Linux 和 FireFox。Blongo 在网页加载后就会显示所输入的所有博客条目,并且允许对任何条目执行更新和删除操作,换句话说,允许进行所有的标准 CRUD 操作。Django 视图拥有三个方法:index、update 和delete。
层叠样式表 (CSS) 定义被引入一个单独的静态文件。相关内容我不想在此处赘述,您可以随意浏览 下载 部分中包含的源代码。
假设已安装好所需的所有工具,并且这些组件都能良好运行,那么请创建一个新的 Django 项目和必要的组件,如 清单 13 所示。
清单 13. 创建 Django 博客项目的命令
$ django-admin.py startproject blongo
$ cd blongo
$ django-admin.py startapp blogapp
$ mkdir templates
$ cd blogapp
$ mkdir static
Django 1.3 的新增内容是一个已包含在 Django 中的贡献型应用程序,可使用它来改进静态文件的处理。通过向任何应用程序目录添加一个静态目录(例如,本例中的 blogapp)并确保 django.contrib.staticfiles 包含在已安装应用程序中,Django 可以查找到诸如 .css 和 .js 的静态文件,而无需使用其他任何方法。清单 14 显示了设置文件的代码行,这些代码行已经进行了相应修改(来自默认的 settings.py 文件),使博客应用程序能够正常运行。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询