Node.js 常用Mongoose方法
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方法相关推荐
- Node.js与Sails~方法拦截器policies
policies sails的方法拦截器类似于.net mvc里的Filter,即它可以作用在controller的action上,在服务器响应指定action之前,对这个action进行拦截,先执行 ...
- JS常用属性方法大全
JS常用属性方法大全 1.输出语句:document.write(""); 2.JS中的注释为: 3.传统的HTML文档顺序是:document->html->(hea ...
- zabbix node.js mysql_Zabbix添加Node.js监控的方法
目前网上已有 pm2-zabbix 工具可以实现Zabbix对Node.js的监控报警,Github地址. 特征: 自动发现通过PM2管理的Node.js进程. 报告Nodes.js进程状态.CPU占 ...
- Node.js 调用 C++ 方法 / C++ Addons 详解
最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用.于是花点时间总结一下. Android开发中Java 调用C++的部分叫JNI, ...
- 前端JS常用工具方法
前端JS常用工具方法 // var ua = window.navigator.userAgent.toLowerCase(); /*** 前端JS常用工具方法* @class Tools*/ exp ...
- MongoDB和Node.js的Mongoose简介
Mongoose是一个JavaScript框架,通常在带有MongoDB数据库的Node.js应用程序中使用. 在本文中,我将向您介绍Mongoose和MongoDB,更重要的是,这些技术适合您的应用 ...
- [Node.js]常用工具
util是一个Node.js的核心工具模块,提供常用的函数,用于弥补核心JavaScript提供的函数过于精简的问题. util.inherits uitl.inherits(constructor, ...
- Node.js使用mongoose操作mongodb
软件配置: 1.node v8.9.3 2. npm 5.5.1 3. mongoose及MongoDB版本见下package.json // package.json { "name& ...
- Mongodb 数据库基本操作语句,结合 Node.js + express + mongoose (实现增、删、改、查,批量增加、修改等,创建临时表,多表查询......)
版本说明 "MongoDB": "4.0.9", // cmd命令窗输入:mongo --version "node": 10.13.0, ...
最新文章
- fcntl函数-文件控制函数
- 深度学习框架TensorFlow(2.创建图,启动图)
- lan口配置 petalinux_PetaLinux安装及使用
- 【Linux】vi编辑器命令
- mysql 索引:类型 、创建
- 无监督学习 | PCA 主成分分析之客户分类
- mysql教程排序_MySQL中的排序函数field()实例详解
- jdom 读取xml_JDOM分析器–将XML文件读取为Java对象
- 鼠标功能不全?这几款鼠标增强辅助工具Mac App不能错过
- 转:知识管理概念综述(一)
- 少年宫计算机活动总结改进措施,少年宫乒乓球的活动总结
- 牛客在线编程101-93 盛水最多的容器
- MySQL学习笔记8:权限管理、数据库备份与设计
- html alert字体颜色,js里alert里的字体颜色怎么设置:字体颜色方法;fontcolor(color)...
- 学计算机编程我有什么好处,学习计算机编程对我们都有什么好处?
- 多可文档管理系统_您的框架有多可扩展性?
- IDC数据中心机房如何选择虚拟机和物理机?
- listview 和RecycleView区别
- Lua 闭包实现pairs和ipairs
- 如何靠代码发家致富?——10种可以赚钱的途径