资讯专栏INFORMATION COLUMN

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

jhhfft / 2370人阅读

摘要:连接开启你的服务首先确保你已安装了,并且配置了的环境变量。此时再进入文件夹,里面会有许多文件。创建连接新建一个任意目录最好新建一个文件夹便于管理。连接错误安装依赖包,运行此文件说明已成功连接到数据库。

连接 开启你的mongodb服务

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

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

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

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

写入第一条数据 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90668.html

相关文章

  • vue2.0开发聊天程序(六) 搞定mongodb

    摘要:为安装文件,无需再配置环境变量。连接操作有以下包作者并未查到除此之外的包,但不代表没有。等于是每个默认配置的主键属性,属性名为可自己定义一个来覆盖此属性。需要注意的是,在新版本的文档中,为。通过创建限于篇幅,本小节暂时写到这里。 我的琴声呜咽,我的泪水全无。我把远方的远归还草原。                   - 海子《九月》 mongodb安装 什么是Mongodb?就是一个基...

    Dr_Noooo 评论0 收藏0
  • vue2.0开发聊天程序(八) 初步完成

    摘要:主要表现在复杂的语句事务支持等。仅支持,在等浏览器中,会出现样式布局混乱的情况。将群群对应的聊天记录保存在数据库。用户进入群聊,则将其加入到对应的中。文件大小不能超过通过模块操作登录注册将用户名作为唯一值。登录支持自动登录,将密码保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...

    wmui 评论0 收藏0
  • XBlog: Vue+Express+Mongodb的全栈可扩展的完整博客系统

    摘要:注册成功后会返回注册用户的此就是上面说到的,用于用户登陆的基础,请保管好。 地址 https://github.com/billyhoomm...http://blog.billyhu.com 说明(Instructions) 本项目后台基于express、mongodb,前台基于Vue2.0全家桶、bootstrap、scss预编译器以及一众工具类插件 项目前后台代码在同一个目录中...

    Salamander 评论0 收藏0

发表评论

0条评论

jhhfft

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<