Node.js 手册查询-Mongoose 方法

一、Schema

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

/* 定义一个 Schema */
var mongoose = require("mongoose");var TestSchema = new mongoose.Schema({name : { type:String },//属性name,类型为Stringage  : { type:Number, default:0 },//属性age,类型为Number,默认为0time : { 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’:1, ‘age’:0} 查询文档的返回结果包含name , 不包含age.(_id默认是1)model.find({},null,{limit:20}); 过滤查询,参数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’:22}, {’$inc’:{‘age’:1} }  );
执行后: age=23

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

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

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

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

数组修改器:

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

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

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

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

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

Model.update({‘age’:22}, {’$push’:{‘array’:{’$each’: [1,2,3,4,5]}} }  );
执行后: array : [10,1,2,3,4,5]

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

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

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

Model.update({‘age’:22}, {’$pull’:{‘array’:10} }  );
执行后: array : [1,2,3,4]  匹配到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”:[20,21,22.‘haha’]} } );
    查询 age等于20或21或21或’haha’的文档Model.find({"$or" :  [ {‘age’:18} , {‘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”:10} );
    查询 array(数组类型)键中有10的文档,  array : [1,2,3,4,5,10]  会匹配到Model.find({“array[5]”:10} );
    查询 array(数组类型)键中下标5对应的值是10,  array : [1,2,3,4,5,10]  会匹配到

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

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

    ‘$size’ 匹配数组长度

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

    ‘$slice’ 查询子集合返回

    Model.find({“array”:{"$skice" : 10} } );
    查询 匹配array数组的前10个元素Model.find({“array”:{"$skice" : [5,10] } } );
    查询 匹配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: "1",msg: err.message,result: ''});}else{res.json({status: "0",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: "1",msg: err.message,result: ''});}else{res.json({status: "0",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: "1",msg: err.message,result: ''});}else{if(doc){var addressList = doc.addressList,num = parseInt(addressList.length) - 1,addressId = addressList[num].addressId,addressNewId = '';addressNewId = parseInt(addressId) + 1;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: "1",msg: err1.message,result: ''});}else{res.json({status: "0",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: "1",msg: err.message,result: ''});}else{if(doc){res.json({status: "0",msg: '',result: doc.addressList});}}});
});

转载于:https://www.cnblogs.com/haonanZhang/p/8306008.html

Node.js 常用Mongoose方法相关推荐

  1. Node.js与Sails~方法拦截器policies

    policies sails的方法拦截器类似于.net mvc里的Filter,即它可以作用在controller的action上,在服务器响应指定action之前,对这个action进行拦截,先执行 ...

  2. JS常用属性方法大全

    JS常用属性方法大全 1.输出语句:document.write(""); 2.JS中的注释为: 3.传统的HTML文档顺序是:document->html->(hea ...

  3. zabbix node.js mysql_Zabbix添加Node.js监控的方法

    目前网上已有 pm2-zabbix 工具可以实现Zabbix对Node.js的监控报警,Github地址. 特征: 自动发现通过PM2管理的Node.js进程. 报告Nodes.js进程状态.CPU占 ...

  4. Node.js 调用 C++ 方法 / C++ Addons 详解

    最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用.于是花点时间总结一下. Android开发中Java 调用C++的部分叫JNI, ...

  5. 前端JS常用工具方法

    前端JS常用工具方法 // var ua = window.navigator.userAgent.toLowerCase(); /*** 前端JS常用工具方法* @class Tools*/ exp ...

  6. MongoDB和Node.js的Mongoose简介

    Mongoose是一个JavaScript框架,通常在带有MongoDB数据库的Node.js应用程序中使用. 在本文中,我将向您介绍Mongoose和MongoDB,更重要的是,这些技术适合您的应用 ...

  7. [Node.js]常用工具

    util是一个Node.js的核心工具模块,提供常用的函数,用于弥补核心JavaScript提供的函数过于精简的问题. util.inherits uitl.inherits(constructor, ...

  8. Node.js使用mongoose操作mongodb

    软件配置: 1.node v8.9.3 2. npm 5.5.1 3. mongoose及MongoDB版本见下package.json // package.json {   "name& ...

  9. Mongodb 数据库基本操作语句,结合 Node.js + express + mongoose (实现增、删、改、查,批量增加、修改等,创建临时表,多表查询......)

    版本说明 "MongoDB": "4.0.9", // cmd命令窗输入:mongo --version "node": 10.13.0, ...

最新文章

  1. fcntl函数-文件控制函数
  2. 深度学习框架TensorFlow(2.创建图,启动图)
  3. lan口配置 petalinux_PetaLinux安装及使用
  4. 【Linux】vi编辑器命令
  5. mysql 索引:类型 、创建
  6. 无监督学习 | PCA 主成分分析之客户分类
  7. mysql教程排序_MySQL中的排序函数field()实例详解
  8. jdom 读取xml_JDOM分析器–将XML文件读取为Java对象
  9. 鼠标功能不全?这几款鼠标增强辅助工具Mac App不能错过
  10. 转:知识管理概念综述(一)
  11. 少年宫计算机活动总结改进措施,少年宫乒乓球的活动总结
  12. 牛客在线编程101-93 盛水最多的容器
  13. MySQL学习笔记8:权限管理、数据库备份与设计
  14. html alert字体颜色,js里alert里的字体颜色怎么设置:字体颜色方法;fontcolor(color)...
  15. 学计算机编程我有什么好处,学习计算机编程对我们都有什么好处?
  16. 多可文档管理系统_您的框架有多可扩展性?
  17. IDC数据中心机房如何选择虚拟机和物理机?
  18. listview 和RecycleView区别
  19. Lua 闭包实现pairs和ipairs
  20. 如何靠代码发家致富?——10种可以赚钱的途径

热门文章

  1. 获取当前周、上一周、下一周日期
  2. C++与C#混合编程
  3. Python自动化开发学习22-Django上
  4. 开发基础(字符编码、列表操作)
  5. 宅男程序员给老婆的计算机课程之8:控制器
  6. 《应用时间序列分析:R软件陪同》——导读
  7. 让Qt Creator支持Windows Phone 8开发
  8. squid之反向代理服务器
  9. 为什么要设置Java环境变量(详解)
  10. Android APK 签名(图)