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. JS判断浏览器类型和屏幕分辨率来调用不同的CSS样式

    代码如下: <!-- if (window.navigator.userAgent.indexOf("MSIE")>=1) { var IE1024="&qu ...

  2. MOS文章翻译

    http://blog.csdn.net/column/details/msdnchina.html?&page=1 http://blog.csdn.net/staricqxyz/artic ...

  3. vs2010+cuda5.0+qt4.8

    在进行CUDA处理的时候,总是在控制台程序下,于是就想要通过qt进行界面处理. 一开始先测试一下qt的环境,新建一个qt项目,不过在运行的时候提示平台不对,换成64位 出现 这个是qt的版本问题,在右 ...

  4. python初码

    第一次用python写代码,有一些不习惯,比如if.else.for.def后要加:.假设换一个编译工具可能会好点,否则仅仅能每次执行的时候查看错误信息.它的优点也正是这里不须要每条语句输入;.不须要 ...

  5. 多个机器获取微信access-token导致的有效性问题

    多个机器获取微信access-token导致的有效性问题 单个机器获取的access-token,只有最后一个是有效的: 多个机器各自获取自己的access-token,都是各自有效的: 在服务器和本 ...

  6. 2014年辛星jquery解读第三节 Ajax

    ***************Ajax********************* 1.Ajax是Asynchronous Javascript And  XML的简写,它指的是异步Javascript ...

  7. 保护眼睛-eclipse黑色背景设置

    eclipse中java编辑器颜色改动,适合程序员人群: 长时间编码,眼睛是有非常大负担的,特别是使用eclipse,它自带的java编辑器背景色是刺眼的白色.代码颜色基本是黑色,这样一个编辑器里白色 ...

  8. Windows移动开发(五)——初始XAML

    关于详细的基本功就先说这么多.后面遇到再补充说明,前面说的都是一些代码和原理方面的东西.接下来说的会有界面和代码结合,会有成就感,由于能真正的做出东西来了. Windows移动开发包含Windows ...

  9. HTML导航 - 点击更改背景

    步骤一: 在须要添加效果的<li>标签中添加onclick事件:<li onclick="setcurrent(this)"> 步骤二: 加入JS代码: f ...

  10. javascript 使用方式

    第一种:内嵌在html节点中 <html> <body> <input type="button" onclick="document.bo ...