Node.js 手册查询-Mongoose 方法

一、Schema

  一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力.可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架

/* 定义一个 Schema */
var mongoose = require("mongoose"); var TestSchema = new mongoose.Schema({
name : { type:String },//属性name,类型为String
age : { type:Number, default: },//属性age,类型为Number,默认为0
time : { type:Date, default:Date.now },
email: { type:String,default:''}
});

上面这个 TestSchema包含4个属性 [name, age, time, email]

二、Model

由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据库属性、行为的类

var db = mongoose.connect("mongodb://127.0.0.1:27017/test");

// 创建Model
var TestModel = db.model("test1", TestSchema);

test1 数据库中的集合名称, 不存在会创建.

model - 文档操作

mongoose的操作方法基本都在文档操作中。

1.构造函数, 参数1:集合名称, 参数2:Schema实例

db.model(“test1”, TestSchema );

2.查询, 参数1忽略,或为空对象则返回所有集合文档

model.find({}, callback);

model.find({},field,callback); 过滤查询,参数2: {‘name’:, ‘age’:} 查询文档的返回结果包含name , 不包含age.(_id默认是1)

model.find({},null,{limit:}); 过滤查询,参数3: 游标操作 limit限制返回结果数量为20个,如不足20个则返回所有.

model.findOne({}, callback); 查询找到的第一个文档

model.findById(‘obj._id’, callback); 查询找到的第一个文档,同上. 但是只接受 __id 的值查询

3.创建, 在集合中创建一个文档

Model.create(文档数据, callback))

4.更新,参数1:查询条件, 参数2:更新对象,可以使用MondoDB的更新修改器

Model.update(conditions, update, function(error)

5.删除, 参数1:查询条件

Model.remove(conditions,callback);

更新修改器:

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

Model.update({‘age’:}, {’$inc’:{‘age’:} }  );
执行后: age=

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

Model.update({‘age’:}, {’$set’:{‘age’:‘haha’} }  );
执行后: age=‘haha’

8.‘$unset’ 同上取反,删除一个键

Model.update({‘age’:}, {’$unset’:{‘age’:‘haha’} }  );
执行后: age键不存在

数组修改器:

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

Model.update({‘age’:}, {’$push’:{‘array’:} }  );
执行后: 增加一个 array 键,类型为数组, 有一个成员

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

 Model.update({‘age’:}, {’$addToSet’:{‘array’:} }  );
执行后: array中有10所以不会添加

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

Model.update({‘age’:}, {’$push’:{‘array’:{’$each’: [,,,,]}} }  );
执行后: array : [,,,,,]

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

Model.update({‘age’:}, {’$pop’:{‘array’:} }  );
执行后: array : [,,,,] tips: 将1改成-1可以删除数组首部元素

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

Model.update({‘age’:}, {’$pull’:{‘array’:} }  );
执行后: array : [,,,] 匹配到array中的10后将其删除

条件查询:

a. “$lt” 小于

b. “$lte” 小于等于

c. “$gt” 大于

d. “$gte” 大于等于

e. “$ne” 不等于

params = {
salePrice:{
$gt: priceGt,
$lte: priceLt
}
}
let goodsModel = Goods.find(params)

或查询 OR:

  • ‘$in’ 一个键对应多个值
  • ‘$nin’ 同上取反, 一个键不对应指定值
  • “$or” 多个条件匹配, 可以嵌套 $in 使用
  • “$not” 同上取反, 查询与特定模式不匹配的文档
    Model.find({“age”:{ “$in”:[,,.‘haha’]} } );
    查询 age等于20或21或21或’haha’的文档 Model.find({"$or" : [ {‘age’:} , {‘name’:‘xueyou’} ] });
    查询 age等于18 或 name等于’xueyou’ 的文档

    类型查询:

    null 能匹配自身和不存在的值, 想要匹配键的值 为null, 就要通过 “$exists” 条件判定键值已经存在 "$exists" (表示是否存在的意思)

  • Model.find(“age” :  { “$in” : [null] , “exists” : true  } );
    查询 age值为null的文档
    Model.find({name: {$exists: true}},function(error,docs){
    //查询所有存在name属性的文档
    }); Model.find({telephone: {$exists: false}},function(error,docs){
    //查询所有不存在telephone属性的文档
    });

    正则表达式:

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

    find( {“name” : /joe/i } )
    查询name为 joe 的文档, 并忽略大小写 find( {“name” : /joe?/i } )
    查询匹配各种大小写组合

    查询数组:

    Model.find({“array”:} );
    查询 array(数组类型)键中有10的文档, array : [,,,,,] 会匹配到 Model.find({“array[]”:} );
    查询 array(数组类型)键中下标5对应的值是10, array : [,,,,,] 会匹配到

    $all’ 匹配数组中多个元素

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

    ‘$size’ 匹配数组长度

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

    ‘$slice’ 查询子集合返回

    Model.find({“array”:{"$skice" : } } );
    查询 匹配array数组的前10个元素 Model.find({“array”:{"$skice" : [,] } } );
    查询 匹配array数组的第5个到第10个元素

常用方法:

1、删除购物车

/**
* 购物车删除
*/
router.post('/cart/del', function(req, res, next) {
var userId = req.cookies.userId,
productId = req.body.productId;
User.update({
userId: userId // 根据 ID 找到相对应的数据库数据
},{
$pull:{ // 删除特定元素
'cartlist': { // 找到 相对的cartlist 根据 productId 删除相对应的 数据
'productId': productId
}
}
}, (err, doc) => {
if(err){
res.json({
status: "",
msg: err.message,
result: ''
});
}else{
res.json({
status: "",
msg: '',
result: doc
});
}
});
});

2、购物车数量修改

/**
* 购物车数量修改
*/
router.post('/cart/edit', function(req, res, next) {
var userId = req.cookies.userId,
productId = req.body.productId,
productNum = req.body.productNum;
// 根据 userId 先找到这个用户数据,再找到跟传递过来的 productId 相对应的 cartlist 里面的那个商品数据,第一步是查找数据
// 这个不找找的是就是子数据,不是 productNum 相对应的那个商品 json
User.update({
"userId": userId,
"cartlist.productId": productId
},{
// 找到那个数据之后 利用这个方法更改数量
'cartlist.$.productNum': productNum
}, (err, doc) => {
if(err){
res.json({
status: "",
msg: err.message,
result: ''
});
}else{
res.json({
status: "",
msg: '',
result: 'suc'
});
}
});
});

3、新增地址(向数据库新添加数据)

router.post('/addNewAddress', (req, res, next) => {
var userId = req.cookies.userId,
addressName = req.body.addressName,
tel = parseFloat(req.body.tel),
streetName = req.body.streetName,
postCode = req.body.postCode; User.findOne({userId: userId}, (err, doc) => {
if(err){
res.json({
status: "",
msg: err.message,
result: ''
});
}else{
if(doc){
var addressList = doc.addressList,
num = parseInt(addressList.length) - ,
addressId = addressList[num].addressId,
addressNewId = '';
addressNewId = parseInt(addressId) + ;
var jsonNew = {
addressId: addressNewId,
addressName: addressName,
tel: tel,
streetName: streetName,
postCode: postCode
};
// 将新建的json数据直接push到以前的数组中,然后保存就可以了
addressList.push(jsonNew);
doc.save((err1, doc1) => {
if(err1){
res.json({
status: "",
msg: err1.message,
result: ''
});
}else{
res.json({
status: "",
msg: '',
result: 'suc'
});
}
}); }
}
});
});

4、查看所有地址(查)

/**
* addressList
*/
router.get('/addressList', function(req, res, next) {
var userId = req.cookies.userId;
User.findOne({userId: userId}, (err, doc) => {
if(err){
res.json({
status: "",
msg: err.message,
result: ''
});
}else{
if(doc){
res.json({
status: "",
msg: '',
result: doc.addressList
});
}
}
});
});

Node.js 常用Mongoose方法的更多相关文章

  1. Node.js常用express方法

    Node.js 手册查询-Express 方法 1.send方法 send 方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据 send方法在输出响应时会自动进行一些设置,比如HEAD信息.H ...

  2. Node.js 常用工具

    Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...

  3. Node.js 常用工具util包

    Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.isError(obj); util.is ...

  4. TODO:Node.js pm2使用方法

    TODO:Node.js pm2使用方法 pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完 ...

  5. JS常用校验方法(判断输入框是否为空,数字,电话,邮件,四舍五入等)

    JS常用校验方法: 1.判断输入框是否为空,为空时弹出提示框 2.关闭窗口 3.检查输入字符串是否为数字 4.强制把大写转换成小写 5.手机号码校验,长度为11位数字. 6.电子邮件校验 7.电话号码 ...

  6. [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

    该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路] ...

  7. Centos7 中 Node.js安装简单方法

    最近,我一直对学习Node.js比较感兴趣.下面是小编给大家带来的Centos7 中 Node.js安装简单方法,在此记录一下,方便自己也方便大家,一起看看吧! 安装node.js 登陆Centos ...

  8. Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

    参考:博客 https://www.cnblogs.com/chentianwei/p/10268346.html 参考: mongoose官网(https://mongoosejs.com/docs ...

  9. Node.js 常用工具 util

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

随机推荐

  1. Spring——BeanFactory

    Spring容器 什么是Spring容器 Spring容器是Spring的核心,它可以创建对象,把他们关联在一起,配置各个对象,并管理每个对象的整个生命周期.Spring容器使用依赖注入(DI)来管理 ...

  2. 改进MySQL Order By Rand()的低效率

    Author:flymorn Source:飘易Categories:PHP编程 PostTime:2011-1-14 15:35:07 正 文: 最近由于需要研究了一下MYSQL的随机抽取实现方法. ...

  3. 理解linux安装软件

    http://www.codecoffee.com/tipsforlinux/articles/27.html -------------------------------------------- ...

  4. Zend_Form 创建、校验和解析表单的基础--(手冊)

    1.  创建表单对象 创建表单对象很easy:仅仅要实现 Zend_Form: <?php $form = newZend_Form; ? > 对于高级用例.须要创建 Zend_Form ...

  5. 2014秋C++ 第8周项目 分支程序设计

    课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703.课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课 ...

  6. hdu4289 Control --- 最小割,拆点

    给一个无向图.告知敌人的起点和终点.你要在图上某些点安排士兵.使得敌人不管从哪条路走都必须经过士兵. 每一个点安排士兵的花费不同,求最小花费. 分析: 题意可抽象为,求一些点,使得去掉这些点之后,图分 ...

  7. crmjs区分窗口是否是高速编辑(2)

    随着crm的版本号不同,有些功能不能使用,这里提供了第二种写法: function loadFrom() {     var formType = Xrm.Page.ui.getFormType(); ...

  8. ios 视频播放代码Demo

    方法一: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. / ...

  9. EarthWarrior3D游戏ios源代码

    这是一款不错的ios源代码源代码,EarthWarrior3D游戏源代码. 而且游戏源码支持多平台. 适用于cocos v2.1.0.0版本号 源代码下载: http://code.662p.com/ ...

  10. B1045 糖果传递 数学

    糖果传递,一开始就想到了n^2的模拟贪心算法,但是一看,数据范围太大,好像只有O(N)能过...没啥方法,只好看题解,之后发现,woc,还有这种操作? 这个题直接可以用数学证明... 证明如下: 首先 ...