vue2.0开发聊天程序(七) mongoose操作

onpwerb 2019-06-26

连接

开启你的mongodb服务

首先确保你已安装了mongodb,并且配置了mongodb的环境变量。
在任意目录(建议在非中文目录)下新建database文件夹,在此文件夹下新建test文件夹(确保此文件夹为空的)。
然后打开cmd,输入:

mongod --dbpath 'test文件夹的绝对路径———— E:\database\test'

vue2.0开发聊天程序(七) mongoose操作

waiting for connections on port 27017 说明你已经在localhost:27017端口上开启了服务。

此时再进入test文件夹,里面会有许多WT文件。

创建连接

新建一个index.js(任意目录,最好新建一个mongodbDemo文件夹便于管理)。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;


db.on('error',console.error.bind(console,'mongodb连接错误:'));
db.once('open',function(){
    console.log('mongodb connection is OK!');
});

安装mongoose依赖包,运行此文件

npm install mongoose

node index.js

vue2.0开发聊天程序(七) mongoose操作

说明已成功连接到数据库。

写入第一条数据 Create

mongoose写入数据的方法有两个,分别是Model.create()和Documents.save()[即上文的Entity];

1.在写入数据之前,先新建一个model

var CatSchema = new mongoose.Schema({ // 新建一个model对象
    name: String
});
var CatModel = mongoose.model('Cat', CatSchema); // 这一步才正式写入数据库,数据库对应的model名为Cat

2.插入一条数据

//Model.create
CatModel.create({name: 'ketty'},function(err,res){ // 第一个参数规定为错误信息
    console.log(err);
    console.log(res);
})

//promise写法
CatModel.create({
    name: 'kitty'
}).then(res=>{console.log(res)}) // 成功返回当前数据
.catch(err=>{console.log(err)});

// Documents.save()
var catDoc = new CatModel({name:'ketty'});

catDoc.save(function (err, res) {
    if (err)console.log(err);
    console.log(res);
  });

基于Model的查询

简单查询

Model.find().then(res=>{ // 传空匹配所有
    log(res);
}).catch(err=>{
    log(err);
});

Model.find({name: 'kitty'}).then(res=>{ // 匹配name为kitty的所有数据
    log(res); // 若为查询到数据 res为[]
}).catch(err=>{
    log(err);
});

Model.findOne({name: 'kitty'}).then(res=>{ // 匹配name为kitty的第一条数据
    log(res); // 若为查询到数据 res为null
}).catch(err=>{
    log(err);
});

Model.findById(id).then(res=>{// 根据id查询
    // tido
}).catch(err=>{
    // tido
})

find和findOne只接受Object作为参数,如果未传参数则默认为{}。传其他数据类型都会抛出异常

条件查询

“$lt” 小于
“$lte” 小于等于
“$gt” 大于
“$gte” 大于等于
“$ne” 不等于

// 查询 age 大于等于18并小于等于30的文档
Model.find({'age':{ '$get':18 , '$lte':30 } } );

或查询

‘$in’ 一个键对应多个值
‘$nin’ 同上取反, 一个键不对应指定值
“$or” 多个条件匹配, 可以嵌套 $in 使用
“$not” 同上取反, 查询与特定模式不匹配的文档

// 查询 age等于20或21或21或’haha’的文档
Model.find({'age':{ '$in':[20,21,22.'haha']} } );

// 查询 age等于18 或 name等于’xueyou’ 的文档
 Model.find({'$or' :  [ {'age':18} , {'name':'xueyou'} ] });

类型查询

"$exists" 是否存在某属性

null 能匹配自身和不存在的值, 想要匹配键的值为null, 就要通过 “$exists” 条件判定键值已经存在

// 查询 age值为null的文档
Model.find('age' :  { '$in' : [null] , 'exists' : true  } );

//查询所有存在name属性的文档
Model.find({name: {$exists: true}});

//查询所有不存在telephone属性的文档
Model.find({telephone: {$exists: false}});

正则表达式

MongoDb 使用 Prel兼容的正则表达式库来匹配正则表达式

// 查询name为 joe 的文档, 并忽略大小写
Model.find( {'name' : /joe/i } )    

//查询匹配各种大小写组合
Model.find( {'name' : /joe?/i } )

查询数组

‘$all’ 匹配数组中多个元素
‘$size’ 匹配数组长度
‘$slice’ 查询子集合返回

// 查询 array(数组类型)键中有10的文档,  array : [1,2,3,4,5,10]  会匹配到
Model.find({'array':10} );

//查询 array(数组类型)键中下标5对应的值是10,  array : [1,2,3,4,5,10]  会匹配到
Model.find({'array[5]':10} );

//查询 匹配array数组中 既有5又有10的文档
Model.find({'array':[5,10]} );

// 查询 匹配array数组长度为3 的文档
Model.find({'array':{'$size' : 3} } );

// 查询 匹配array数组的前10个元素
Model.find({'array':{'$skice' : 10} } );

//查询 匹配array数组的第5个到第10个元素

Model.find({'array':{'$skice' : [5,10] } } );

Where_javacript语句查询

用$where可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回

Model.find({"$where": function() {
        if (this.x !== null && this.y !== null) {
            return this.x + this.y === 10 ? true : false; // retrun将替代返回结果
        } else {
            return true;
        }
    }
})

Model.find( {"$where" :  "this.x + this.y === 10" } ) // this指向Model
Model.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )

联表查询

要实现联表查询需要将连接的Model的主键_id指向需要对应Model的某个属性上。使用populate进行查询
实现方法如下:

// *****************创建Model************
var cityModel= mongoose.model('city', {
    cityName: String,
    townList: []
});
var countryModel = mongoose.model('country', {
    country: String,
    cityList:[{
           type: mongoose.Schema.ObjectId,
        ref: 'city'  // 将'sity'Model的主键与country的cityList对应
    }]
});

// ****************插入数据************************
cityModel.create({cityName:'shanghai',townList:['lujiazui']});
cityModel.create({cityName:'guangzhou',townList:['tianhe']});
cityModel.create({cityName:'beijing',townList:['zhaoyang']});

var countryObj = {
    country:'china',
    cityList:[]
}
cityModel.find().then(res=>{  //将所有数据查出,并将对应的_id存入数组
    for(let i in res){
        countryObj.cityList.push(res[i]._id);
    }
    // 插入国家数据
    countryModel.create(countryObj,function(err,res){
        console.log(err);
        console.log('res' + res);
    }); 
});

// ****************查询结果**********************
countryModel.find().then(res=>{ // 普通查询
        console.log(res);
}).catch(err=>{
    console.log(err);
})
/*结果为
[ { cityList:
     [ 5a4ded2b78110500d8b94726,
       5a4ded2b78110500d8b94725,
       5a4ded2b78110500d8b94727 ],
    _id: 5a4df149c249713348a2f546,
    country: 'china',
    __v: 0 } ]
*/
countryModel.find({country: 'china'}).populate('cityList').then(res=>{ // populate查询
        console.log(res);
})
/*
[ { cityList: [ [Object], [Object], [Object] ],
    _id: 5a4df149c249713348a2f546,
    country: 'china',
    __v: 0 } ]
*/

游标

limit(3) 限制返回结果的数量
skip(3) 跳过前3个文档,返回其余的
sort( 'username':1 , 'age':-1 } ) 排序 键对应文档的键名, 值代表排序方向, 1 升序, -1降序

更新数据

‘$inc’ 增减修改器,只对数字有效.下面的实例: 找到 age=22的文档,修改文档的age值自增1

Model.update({'age':22}, {'$inc':{'age':1}});

‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.

Model.update({'age':22}, {'$set':{'age':'haha'}});

‘$unset’ 删除一个键

Model.update({‘age’:22}, {’$unset’:{‘age’:‘haha’} }  );

数组更新

‘$push’ 给一个键push一个数组成员,键不存在会创建

Model.update({'age':22}, {'$push':{'array':10} }  );

‘$addToSet’ 向数组中添加一个元素,如果存在就不添加

Model.update({'age':22}, {'$addToSet':{'array':10} }  );

‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值

Model.update({'age':22}, {'$push':{'array':{'$each': [1,2,3,4,5]}} }  );

‘$pop’ 向数组中尾部删除一个元素

Model.update({'age':22}, {'$pop':{'array':1} }  );

‘$pull’ 向数组中删除指定元素

Model.update({'age':22}, {'$pull':{'array':10} }  );

删除

Model.remove(conditions,callback); // conditions为查询条件,可参考find

相关推荐

hanyueqi / 0评论 2019-06-28