- 数据表 | _id | name | grades | __v | | —- | —- | —- | —- | | 6017befb5c36d64d08b72576 | 小明 | 68 | 0 | | 6017befb5c36d64d08b72577 | 小芳 | 94 | 0 | | 6017c455ba09d355a49ec8eb | 小红 | 52 | 0 | | 6017c455ba09d355a49ec8ec | 小刚 | 46 | 0 |
1.1【find()】
Model.find(conditions, [projection], [options], [callback])
参数
conditions
:查询条件[projection]
:控制返回字段[options]
:配置查询参数[callback]
:回调函数 – function(err,docs){}
案例:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
if(!err){
var schema = new mongoose.Schema({name:String,grades:Number})
var stuModel = mongoose.model('grades',schema)
//查询所有数据
stuModel.find((err,docs) => {
if(!err){
console.log(docs)
}
})
/* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },
{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
{ _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
//查询成绩大于60以上的数据
stuModel.find({grades:{$gte:60}},(err,docs) => {
if(!err){
console.log(docs)
}
})
/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
//查询成绩大于60以上且名字里存在‘芳’的数据
stuModel.find({name:/芳/,grades:{$gte:60}},(err,docs) => {
if(!err){
console.log(docs)
}
})
/*[
* { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
* ]*/
//查询名字里存在‘明’的数据且只输出‘name’字段
//_id默认会返回
stuModel.find({name:/明/},{name:1,_id:0},(err,docs) => {
if(!err){
console.log(docs)
}
})
// [{name: '小明'}]
//找出跳过前两条数据的其他数据
stuModel.find(null,null,{skip:2},(err,docs) => {
if(!err){
console.log(docs)
}
})
/*[{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
{ _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
}
})
1.2【findById()】
Model.findById(id, [projection], [options], [callback])
案例: ```javascript var mongoose = require(‘mongoose’) mongoose.connect(‘mongodb://localhost:27017/student’,(err) => { if(!err){
var schema = new mongoose.Schema({name:String,grades:Number})
var stuModel = mongoose.model('grades',schema)
//保存查询数据的_id
var aIDArr = []
//查询所有数据
stuModel.find((err,docs) => {
if(!err){
docs.forEach((item,index,arr)=>{
aIDArr.push(item._id)
})
//显示第 0 个元素的所有字段
stuModel.findById(aIDArr[0],(err,doc)=>{
if(!err){
console.log(doc)
}
})
// { _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 }
//显示第 0 个元素且只输出name字段
stuModel.findById(aIDArr[0],{name:1,_id:0},(err,doc)=>{
if(!err){
console.log(doc)
}
})
// { name: '小明' }
//显示第 0 个元素且输出最少的字段(_id默认输出)
stuModel.findById(aIDArr[0],{lean:true},(err,doc)=>{
if(!err){
console.log(doc)
}
})
// { _id: 6017befb5c36d64d08b72576 }
}
})
} })
<a name="WSx0B"></a>
### 1.3【**findOne()**】
- 返回查询到的数据的第一个
- `Model.findOne([conditions], [projection], [options], [callback])`
- 案例:
```javascript
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
if(!err){
var schema = new mongoose.Schema({name:String,grades:Number})
var stuModel = mongoose.model('grades',schema)
//找出age>20的文档中的第一个文档
stuModel.findOne({grades:{$gt:80}},(err,doc) => {
if(!err){
console.log(doc)
}
})
//{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
//找出age>20的文档中的第一个文档,且只输出name字段
stuModel.findOne({grades:{$gt:80}},{name:1,_id:0},(err,doc) => {
if(!err){
console.log(doc)
}
})
//{ name: '小芳' }
//找出age>20的文档中的第一个文档,且输出包含name字段在内的最短字段
stuModel.findOne({grades:{$gt:80}},{lern:true},(err,doc) => {
if(!err){
console.log(doc)
}
})
//{ _id: 6017befb5c36d64d08b72577 }
}
})
1.4 复杂查询【$where】
$where
可以使用任意的 JavaScript 作为查询的一部分,包含JavaScript 表达式的字符串或者函数案例:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
if(!err){
var schema = new mongoose.Schema({name:String,grades:Number})
//添加一个测试字段
// schema.add({test:Number})
var stuModel = mongoose.model('grades',schema)
//添加两条数据
// stuModel.create([{name:"小花",grades:76,test:76},{name:"小兰",grades:60,test:30}],(err,docs)=>{
// console.log(docs)
// })
//字符串 es5中this与obj指向一样,es6中只能用obj
stuModel.find({$where:"this.grades == this.test" || "obj.grades == obj.test"},(err,doc) => {
if(!err){
console.log(doc)
}
})
//[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0}]
//函数
stuModel.find({$where:function() {
return this.grades == this.test || obj.grades == obj.test*2
}},(err,doc) => {
if(!err){
console.log(doc)
}
})
/*[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0},
{_id: 6017d7cb8a95cb2a00aae3af,name: '小兰',grades: 60,test: 30,__v: 0}]*/
}
})
1.5 常用查询条件
$or 或关系
$nor 或关系取反
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in 在多个值范围内
$nin 不在多个值范围内
$all 匹配数组中多个值
$regex 正则,用于模糊查询
$size 匹配数组大小
$maxDistance 范围查询,距离(基于LBS)
$mod 取模运算
$near 邻域查询,查询附近的位置(基于LBS)
$exists 字段是否存在
$elemMatch 匹配内数组内的元素
$within 范围查询(基于LBS)
$box 范围查询,矩形范围(基于LBS)
$center 范围醒询,圆形范围(基于LBS)
$centerSphere 范围查询,球形范围(基于LBS)
$slice 查询字段集合中的元素(比如从第几个之后,第N到第M个元素
1.6 * 特定类型查询
- 数据表 | _id | name | grades | __v | test | | —- | —- | —- | —- | —- | | 6017befb5c36d64d08b72576 | 小明 | 68 | 0 | 1 | | 6017befb5c36d64d08b72577 | 小芳 | 94 | 0 | 3 | | 6017c455ba09d355a49ec8eb | 小红 | 52 | 0 | 5 | | 6017c455ba09d355a49ec8ec | 小刚 | 46 | 0 | 2 | | 6017d7cb8a95cb2a00aae3ae | 小花 | 76 | 0 | 4 | | 6017d7cb8a95cb2a00aae3af | 小兰 | 60 | 0 | 6 |
方法
方法 | 作用 |
---|---|
sort | 排序 |
skip | 跳过 |
limit | 限制 |
select | 显示字段 |
exect | 执行 |
count | 计数 |
distinct | 去重 |
案例:
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
var stuModel = mongoose.model('grades', Schema);
// 按test从小到大排序
stuModel.find().sort('test').exec((err,docs)=>{
console.log(docs)
})
// 按test从大到小排列
stuModel.find().sort('-test').exec((err,docs)=>{
console.log(docs)
})
// 跳过1个,显示其他
stuModel.find().skip(1).exec((err,docs)=>{
console.log(docs)
})
// 显示2个
stuModel.find().limit(2).exec((err,docs)=>{
console.log(docs)
})
// 显示name、grades字段,不显示_id字段
stuModel.find().select('name grades -_id').exec((err,docs)=>{
console.log(docs)
})
// 跳过第1个后,只显示2个数据,按照grades由大到小排序,且不显示_id字段
stuModel.find().skip(1).limit(2).sort('-grades').select('-_id').exec((err,docs)=>{
console.log(docs)
/*[{ name: '小明', grades: 78, __v: 0, test: 1 },
{ name: '小花', grades: 76, test: 4, __v: 0 }]*/
})
// 显示集合stuModel中的文档数量
stuModel.find().count((err,count)=>{
console.log(count)
//6
})
// 返回集合stuModel中的grades的值
stuModel.find().distinct('grades',(err,distinct)=>{
console.log(distinct)
//[ 46, 52, 60, 76, 78, 94 ]
})