[toc]
## 查看數據庫
```
show dbs
```
默認已經存在的數據庫
- admin
- local
## 原生查詢
### 嵌套文檔的查詢
想要的是數組成員或則普通類型
```
>db.users.find({hobbies:"eat"});
{
...
"name":"ahhh"
"hobbies":["eat","baseball"]
}
```
想要的是對象成員,并且還能夠無線`.`縱深下去
```
>db.users.find({"hobbies.eat":{$exists:true}});
{
...
"name":"ahhh"
"hobbies":{
"eat":{"desc":"so high"}
}
}
```
對象里面包數組,查找數組成員中name為hiking的
```
>db.users.find({hobbies.name:"hiking"});
{
...
"name":"ahhh"
"hobbies":[
{
"name":"hiking"
,"level":"great"
}
,{
"name":"painting"
,"level":"fine"
}
]
}
```
對象里面包數組,查找數組成員中第一個name為hiking的的
```
db.users.find({"hobbies.0.name":"hiking"})
```
### findOne
只會查找一條文檔記錄
```
>db.students.findOne();
```
### find
查看集合下所有文檔
```
>db.students.find();
>db.students.find().pretty(); //pretty會優化顯示格式
```
#### 篩選顯示字段
1:顯示該字段
0:不顯示該字段
當一個`{}`只設置一個字段時,`1`和`0`代表的是只顯示該字段和除了該字段都顯示。
當一個`{}`中設置了多個字段時,`1`和`0`不能同時存在,只能全是1或則全是0(**除了`_id`**)
> **注意:** 以下會報錯,因為邏輯沖突了
```
>db.students.find({},{name:1,age:0});
```
除了1、0,也可以進行一般的查詢篩選
#### 條件查找
##### $in
離散查找
```
db.students.find({age:[$in:[20,70]]});
```
##### $nin
$in取反
```
db.students.find({age:[$nin:[20,70]]});
```
##### $not
非
```
db.students.find(age:{$not:{$in:[20,70]}});
```
##### $gt和$lt
- $gt :大于
- $gte :大于等于
- $lt:小于
- $lte:小于等于
```
db.students.find({age:{$gte:20,$lte:70}});
```
```
db.students.find({age:{$not:{$gte:20,$lte:70}}});;
```
##### 完全匹配
```
db.students.find({hobby:["1","2","3"]})
```
##### 關于值為數組的情況
且
```
db.students.find({hobby:{$all:['smoking','drinking']}})
```
$in 和 數組 -> 離散
```
db.students.find({hobby:{$in:['smoking','drinking']}})
```
$size
```
db.students.find({hobby:{$size:3}}) //有三個hobby的
```
$where
```
db.students.find($where:"this.age>30&&this.age<100")
```
$slice
若想要hobby這種數據(數組形式的值),只顯示其中的幾項,需要用到`$slice`截取(注意這個操作并不是篩選而只是決定是否顯示)
```
//$slice:2 就是0、1
//$slice:-2 就是倒數最后一個和倒數第二個
db.students.find({hobby:{$size:3},{hobby:{$slice:2},_id:false})
```
##### 依據id查找
```
{_id:ObjectId("...")}
```
##### 正則查找`//`or`$regex`
```
{name:/.../}
{name:{$regex:"..."}}
```
##### 與和或
且
```
db.students.find({name:'ahhh',age:999});
```
or
```
db.students.find($or:[{name:'ahhh'},{age:999}]);
```
且或連用
名字是ahhh,年齡是20或則100
```
db.students.find({name:'ahhh',$or:[{age:20},{age:100}]});
```
##### $exists
將沒有age字段的數據查出
```
db.students.find({age:{$exists:false}});
```
#### cursor
```
var db = connect('students');
//返回的是一個游標,指向結果集的一個指針
var cursor = db.students.find();
while(cursor.hasNext()){
var record = cursor.next();
printjson(record);
}
```
或則
```
var db = connect('students');
cursor.forEach(function(item){
printjson(item);
});
```
#### 分頁查詢
跳過前三條取三條
```
db.students.find().skip(3).limit(3);
```
```
var pagesize = 3;
var pagenumber = 2;
db.students.find().skip(pagenumber-1)*pagesize).limit(pagesize).sort(1)
```
每個`()`方法不論順序
## mongoose查詢
### 查詢不到時的結果
為`[]`數組,這貨在判斷里不等于false
### 基礎查詢
>語法
>Model.find(查詢條件,callback);
```
Model.find({},function(error,docs){
//若沒有向find傳遞參數,默認的是顯示所有文檔
});
Model.find({ "age": 111 }, function (error, docs) {
if(error){
console.log("error :" + error);
}else{
console.log(docs); //docs: age為111的所有文檔
}
});
```
#### 屬性過濾
>語法
>find(Conditions,field,callback)
```
//field省略或為Null,則返回所有屬性。
//返回只包含name、age兩個鍵的所有記錄
Model.find({},{name:1, age:1, _id:0},function(err,docs){
//docs 查詢結果集
})
```
我們只需要把顯示的屬性設置為大于零的數就可以,當然1是最好理解的,_id是默認返回,如果不要顯示加上`("_id":0)`
#### findOne(查詢單條)
>語法
>findOne(Conditions,callback)
find相同,但只返回單個文檔,也就說當查詢到即一個符合條件的數據時,將停止繼續查詢,并返回查詢結果 語法
```
TestModel.findOne({ age: 111}, function (err, doc){
// 查詢符合age等于6的第一條數據
// doc是查詢結果
});
```
#### findById(按ID單條數據)
>語法
>findById(_id, callback)
與findOne相同,但它只接收文檔的_id作為參數,返回單個文檔 語法
與原生不同的是,原生需要使用`ObjectId()`
```
PersonModel.findById(person._id, function (err, doc){
//doc 查詢結果文檔
});
```
#### $gt、$lt(大于、小于)
查詢時我們經常會碰到要根據某些字段進行條件篩選查詢,比如說Number類型,怎么辦呢,我們就可以使用$gt(>)、$lt(<)、$lte(<=)、$gte(>=)操作符進行排除性的查詢,如下示例:
```
Model.find({"age":{"$gt":6}},function(error,docs){
//查詢所有nage大于6的數據
});
Model.find({"age":{"$lt":6}},function(error,docs){
//查詢所有nage小于6的數據
});
Model.find({"age":{"$gt":6,"$lt":9}},function(error,docs){
//查詢所有nage大于6小于9的數據
});
```
#### $ne(不等于)
$ne(!=)操作符的含義相當于不等于、不包含,查詢時我們可通過它進行條件判定,具體使用方法如下:
```
Model.find({ age:{ $ne:6}},function(error,docs){
//查詢age不等于6的所有數據
});
```
#### $in(包含)
和$ne操作符相反,$in相當于包含、等于,查詢時查找包含于指定字段條件的數據
```
Model.find({ age:{ $in: 6}},function(error,docs){
//查詢age等于6的所有數據
});
Model.find({ age:{$in:[6,7]}},function(error,docs){
//可以把多個值組織成一個數組
});
```
#### $or(或者)
可以查詢多個鍵值的任意給定值,只要滿足其中一個就可返回,用于存在多個條件判定的情況下使用,如下示例:
```
Model.find({"$or":[{"name":"zfpx"},{"age":6}]},function(error,docs){
//查詢name為zfpx或age為6的全部文檔
});
```
#### $exists(是否存在)
$exists操作符,可用于判斷某些關鍵字段是否存在來進行條件查詢。如下示例:
```
Model.find({name: {$exists: true}},function(error,docs){
//查詢所有存在name屬性的文檔
});
Model.find({email: {$exists: false}},function(error,docs){
//查詢所有不存在email屬性的文檔
});
```
### 高級查詢
可以限制結果的數量,跳過部分結果,根據任意鍵對結果進行各種排序
所有這些選項都要在查詢被發送到服務器之前指定
#### limit(限制數量)
>語法
>find(Conditions,fields,options,callback);
在查詢操作中,有時數據量會很大,這時我們就需要對返回結果的數量進行限制 那么我們就可以使用limit函數,通過它來限制結果數量。 語法
```
Model.find({},null,{limit:20},function(err,docs){
console.log(docs);
});
```
如果匹配的結果不到20個,則返回匹配數量的結果,也就是說limit函數指定的是上限而非下限
#### skip(跳過/略過的數量)
>語法
>find(Conditions,fields,options,callback);
skip函數的功能是略過指定數量的匹配結果,返回余下的查詢結果 如下示例:
```
Model.find({},null,{skip:4},function(err,docs){
console.log(docs);
});
```
如果查詢結果數量中少于4個的話,則不會返回任何結果。
#### sort函數
>語法
>find(Conditions,fields,options,callback)
sort函數可以將查詢結果數據進行排序操作 該函數的參數是一個或多個鍵/值對 鍵代表要排序的鍵名,值代表排序的方向,1是升序,-1是降序 語法
```
Model.find({},null,{sort:{age:-1}},function(err,docs){
//查詢所有數據,并按照age降序順序返回數據docs
});
```
sort函數可根據用戶自定義條件有選擇性的來進行排序顯示數據結果。
#### 分頁查詢
```
Model('User').find({})
.sort({createAt:-1})
.skip((pageNum-1)*pageSize)
.limit(pageSize)
.populate('user')
.exec(function(err,docs){
console.log(docs);
});
```
#### populate
連表查詢
```
var mongoose = require('mongoose');
//連接數據庫
mongoose.connect('mongodb://localhost:27017/201606blog');
//定義課程Schema
var CourseSchema = new mongoose.Schema({
name:String
});
var CourseModel = mongoose.model('Course',CourseSchema);
var PersonSchema = new mongoose.Schema({
name:{
type:String,
required:true
},
// 外鍵 別的集合的主鍵
course:{
type:mongoose.Schema.Types.ObjectId,
ref:'Course' //指明此外鍵是哪個集合中的外鍵
}
});
var PersonModel = mongoose.model('Person',PersonSchema);
CourseModel.create({name:'node.js'},function(err,course){
PersonModel.create({name:'ahhh',course:course._id},function(err,doc){
console.log(doc);
PersonModel.findById(doc._id).populate('course').exec(function(err,doc){
console.log(doc); //連表查詢后的結果
})
})
});
```