Python Mongodb 查询文档
Python Mongodb
MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。
本文使用的测试数据如下:
查询一条数据
我们可以使用
find_one()
方法来查询集合中的一条数据。
查询
sites
文档中的第一条数据:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
x
=
mycol
.
find_one
(
)
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
查询集合中所有数据
find()
方法可以查询集合中的所有数据,类似 SQL 中的
SELECT *
操作。
以下实例查找
sites
集合中的所有数据:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
for
x
in
mycol
.
find
(
)
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
查询指定字段的数据
我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
for
x
in
mycol
.
find
(
{},{
"
_id
"
:
0
,
"
name
"
:
1
,
"
alexa
"
:
1
}
)
:
print
(
x
)
输出结果为:
{'name': 'RUNOOB', 'alexa': '10000'}
{'name': 'Google', 'alexa': '1'}
{'name': 'Taobao', 'alexa': '100'}
{'name': 'QQ', 'alexa': '101'}
{'name': 'Facebook', 'alexa': '10'}
{'name': '知乎', 'alexa': '103'}
{'name': 'Github', 'alexa': '109'}
除了 _id,你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
以下实例除了 alexa 字段外,其他都返回:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
for
x
in
mycol
.
find
(
{},{
"
alexa
"
:
0
}
)
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'url': 'https://www.github.com'}
以下代码同时指定了 0 和 1 则会报错
:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
for
x
in
mycol
.
find
(
{},{
"
name
"
:
1
,
"
alexa
"
:
0
}
)
:
print
(
x
)
错误内容大概如下:
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.
根据指定条件查询
我们可以在
find()
中设置参数来过滤数据。
以下实例查找 name 字段为 "RUNOOB" 的数据:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
myquery
= {
"
name
"
:
"
RUNOOB
"
}
mydoc
=
mycol
.
find
(
myquery
)
for
x
in
mydoc
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
查询的条件语句中,我们还可以使用修饰符。
以下实例用于读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为
{"$gt": "H"}
:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
myquery
= {
"
name
"
: {
"
$gt
"
:
"
H
"
} }
mydoc
=
mycol
.
find
(
myquery
)
for
x
in
mydoc
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
myquery
= {
"
name
"
: {
"
$regex
"
:
"
^R
"
} }
mydoc
=
mycol
.
find
(
myquery
)
for
x
in
mydoc
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
返回指定条数记录
如果我们要对查询结果设置指定条数的记录可以使用
limit()
方法,该方法只接受一个数字参数。
以下实例返回 3 条文档记录:
import
pymongo
myclient
=
pymongo
.
MongoClient
(
"
mongodb://localhost:27017/
"
)
mydb
=
myclient
[
"
runoobdb
"
]
mycol
=
mydb
[
"
sites
"
]
myresult
=
mycol
.
find
(
)
.
limit
(
3
)
for
x
in
myresult
:
print
(
x
)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
Python Mongodb