MongoDB之查询文档

124 阅读4分钟

MongoDB 查询文档使用 find()findOne() 方法。

find() 方法以非结构化的方式来显示所有文档。

语法

MongoDB 查询数据的语法格式如下:

db.collection/find(query,projection)
  • query :用于查找文档的查询条件,默认为 {},即匹配所有文档
  • projection : (可选): 指定返回结果中包含或排除的字段

查找所有文档:

db.comment.find()

图片.png

按条件查询文档:

db.comment.find({userid:"1004"})

图片.png

按条件查询文档,并返回指定字段:

db.comment.find({userid:"1004"},{articleid:1,content:1,userid:1})

图片.png

注意:

若想要默认字段(_id)不显示,可以将1设置为0

如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:

 db.comment.find().pretty()

图片.png

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>

]