MongoDB 查询文档使用 find()、findOne() 方法。
find() 方法以非结构化的方式来显示所有文档。
语法
MongoDB 查询数据的语法格式如下:
db.collection/find(query,projection)
- query :用于查找文档的查询条件,默认为
{},即匹配所有文档 - projection : (可选): 指定返回结果中包含或排除的字段
查找所有文档:
db.comment.find()
按条件查询文档:
db.comment.find({userid:"1004"})
按条件查询文档,并返回指定字段:
db.comment.find({userid:"1004"},{articleid:1,content:1,userid:1})
注意:
若想要默认字段(
_id)不显示,可以将1设置为0
如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:
db.comment.find().pretty()
findOne()
findOne()方法用于查找集合中的单个文档. 如果找到多个匹配的文档,它只返回第一个
语法:
db.collection.findOne(query,projection)
- query: 用于查找文档的查询条件,默认为
{},即匹配所有文档 - projection: (可选) 指定返回结果中包含或排除的字段
查找单个文档:
articledb> db.comment.findOne({articleid:"100001"})
{
_id: '2',
articleid: '100001',
content: '确实,生活中少一点物质追求,多一份对健康的关怀,简单如一杯清水也能带来极大的满足。',
userid: '1003',
nickname: '凯撒大帝',
createdatetime: ISODate('2019-06-07T10:15:30.123Z'),
likenum: 850,
state: '1'
}
查找单个文档,并返回指定字段:
articledb> db.comment.findOne({articleid:"100001"},{articleid:1,content:1,_id:0})
{
articleid: '100001',
content: '确实,生活中少一点物质追求,多一份对健康的关怀,简单如一杯清水也能带来极大的满足。'
}
高级查询方法
使用比较操作符
MongoDB支持多种逻辑操作符,如$and $or $not $nor等
查找点赞数大于1000的文档:
articledb> db.comment.find({likenum:{$gt:1000}})
[
{
_id: '5',
articleid: '100001',
content: '非常同意您的观点,健康才是最重要的财富。每天喝足量的水对于维持良好的身体状态至关重要。',
userid: '1006',
nickname: '月下独酌',
createdatetime: ISODate('2019-03-14T14:15:25.345Z'),
likenum: 1100,
state: '1'
},
{
_id: '6',
articleid: '100001',
content: '简单的幸福往往最珍贵。让我们从今天开始减少不必要的开支,并更加注重个人及家人的健康吧!',
userid: '1007',
nickname: '星梦奇缘',
createdatetime: ISODate('2019-12-25T00:00:00.000Z'),
likenum: 1200,
state: '1'
},
{
_id: '7',
articleid: '100001',
content: '今天,我想和大家分享一下关于健康饮食的问题。',
userid: '1008',
nickname: '风华浪尖',
createdatetime: ISODate('2019-05-05T10:30:15.123Z'),
likenum: 1300,
state: '1'
}
]
articledb>
使用逻辑操作符
如:$and $for $not $nor等
查找点赞数大于1000且文章id为100001的文档:
articledb> db.comment.find({$and:[{likenum:{$gt:1000}},{articleid:"100001"}]})
[ { _id: '5', articleid: '100001', content: '非常同意您的观点,健康才是最重要的财富。每天喝足量的水对于维持良好的身体状态至关重要。', userid: '1006', nickname: '月下独酌', createdatetime: ISODate('2019-03-14T14:15:25.345Z'), likenum: 1100, state: '1' }, { _id: '6', articleid: '100001', content: '简单的幸福往往最珍贵。让我们从今天开始减少不必要的开支,并更加注重个人及家人的健康吧!', userid: '1007', nickname: '星梦奇缘', createdatetime: ISODate('2019-12-25T00:00:00.000Z'), likenum: 1200, state: '1' }, { _id: '7', articleid: '100001', content: '今天,我想和大家分享一下关于健康饮食的问题。', userid: '1008', nickname: '风华浪尖', createdatetime: ISODate('2019-05-05T10:30:15.123Z'), likenum: 1300, state: '1' }]
articledb>
使用正则表达式
查找昵称中带有花字的文档
articledb> db.comment.find({nickname:/花/})
[ { _id: '4', articleid: '100001', content: '说得好!我们应该更加重视日常的小确幸,比如一杯干净温暖的水,它能给予我们无限的能量。', userid: '1005', nickname: '花开半夏', createdatetime: ISODate('2019-11-11T07:30:15.987Z'), likenum: 920, state: '1' }]
articledb>
投影
投影用于控制查询结果中返回的字段,可以使用包含字段和排除字段两种方式
只返回文章id和点赞数
articledb> db.comment.find({articleid:/100001/,likenum:{$gt:1000}},{articleid:1,userid:1,likenum:1,_id:0})
[
{ articleid: '100001', userid: '1006', likenum: 1100 },
{ articleid: '100001', userid: '1007', likenum: 1200 },
{ articleid: '100001', userid: '1008', likenum: 1300 }
]
articledb>
排序
对点赞数进行降序排序
articledb> db.comment.find({articleid:/100001/,likenum:{$gt:1000}},{articleid:1,userid:1,likenum:1,_id:0}).sort({likenum:-1})
[
{ articleid: '100001', userid: '1008', likenum: 1300 },
{ articleid: '100001', userid: '1007', likenum: 1200 },
{ articleid: '100001', userid: '1006', likenum: 1100 }
]
articledb>
对点赞数进行升序排序
articledb> db.comment.find({articleid:/100001/,likenum:{$gt:1000}},{articleid:1,userid:1,likenum:1,_id:0}).sort({likenum:1})
[
{ articleid: '100001', userid: '1006', likenum: 1100 },
{ articleid: '100001', userid: '1007', likenum: 1200 },
{ articleid: '100001', userid: '1008', likenum: 1300 }
]
articledb>
限制与跳过
可以对查询结果进行限制和跳过指定数量的文档
返回前3个文档
articledb> db.comment.find().limit(3)
[
{
_id: ObjectId('672df740edddfce8730d8190'),
articleid: '100000',
content: '今天天气真好,阳光明媚',
userid: '1001',
nickname: 'Rose',
createdatetime: ISODate('2024-11-08T11:34:24.247Z'),
likenum: 10,
state: null
},
{
_id: '2',
articleid: '100001',
content: '确实,生活中少一点物质追求,多一份对健康的关怀,简单如一杯清水也能带来极大的满足。',
userid: '1003',
nickname: '凯撒大帝',
createdatetime: ISODate('2019-06-07T10:15:30.123Z'),
likenum: 850,
state: '1'
},
{
_id: '3',
articleid: '100001',
content: '赞同!与其追逐新潮电子产品,不如投资于自己的身心健康。一杯温暖的水,简单却美好。',
userid: '1004',
nickname: '云淡风轻',
createdatetime: ISODate('2019-09-20T15:45:45.678Z'),
likenum: 781,
state: '1'
}
]
articledb>
跳过前4个文档,返回接下来的2个文档
articledb> db.comment.find().skip(4).limit(2)
[ { _id: '5', articleid: '100001', content: '非常同意您的观点,健康才是最重要的财富。每天喝足量的水对于维持良好的身体状态至关重要。', userid: '1006', nickname: '月下独酌', createdatetime: ISODate('2019-03-14T14:15:25.345Z'), likenum: 1100, state: '1' }, { _id: '6', articleid: '100001', content: '简单的幸福往往最珍贵。让我们从今天开始减少不必要的开支,并更加注重个人及家人的健康吧!', userid: '1007', nickname: '星梦奇缘', createdatetime: ISODate('2019-12-25T00:00:00.000Z'), likenum: 1200, state: '1' }]
articledb>
]