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. C/C++ uchar的一个有趣用法

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490 图像处理中常常使用的一种 ...

  2. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  3. 一个效果非常华丽的仿桌面APP,却胜似Launcher

    开发Android APP的同学是否对于Launcher实现的绚丽效果而痴迷呢?什么.连Android Launcher是什么都不知道.好吧,拿起侬的手机.在解锁后的首页界面上左右滑动滑动,体验体验, ...

  4. Spring源代码解析和配置文件载入

    Spring类的继承结构图: Spring运用了大量的模板方法模式和策略模式,所以各位看源代码的时候,务必留意,每个继承的层次都有不同的作用.然后将同样的地方抽取出来,依赖抽象将不同的处理依照不同的策 ...

  5. HDU 5289 Assignment (ST算法区间最值+二分)

    题目链接:pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289 题面: Assignment Time Limit: 400 ...

  6. [ JavaScript ] JavaScript 实现继承.

    对于javascript中的继承,因为js中没有后端语言中的类式继承.所以js中的继承,一般都是原型继承(prototype). function P (name){ this.name = name ...

  7. luogu1220 关路灯

    题目大意 路面上有一些开着的灯,每个灯有功率和它的位置,人在第c个灯处,行走速度1m/s.问怎样关灯能使耗能最小,输出这个耗能. 思路 #include <cstdio> #include ...

  8. local_response_normalization 和 batch_normalization

    Normalization   Normalization local_response_normalization local_response_normalization出现在论文”ImageNe ...

  9. 线性回归(最小二乘法、批量梯度下降法、随机梯度下降法、局部加权线性回归) C++

    We turn next to the task of finding a weight vector w which minimizes the chosen function E(w). Beca ...

  10. MySQL学习笔记之内连接

    不多说,直接上干货!  MySQL的内连接 #内连接,两个表按照条件匹配 select class1.stuid,class1.stuname,class1.sex,course from class ...