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. 关于单CPU,多CPU上的原子操作

    所谓原子操作,就是"不可中断的一个或一系列操作" . 硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作& ...

  2. [转]十五天精通WCF——第二天 告别烦恼的config配置

    经常搞wcf的基友们肯定会知道,当你的应用程序有很多的“服务引用”的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人.. ...

  3. [MongoDB]Python 操作 MongoDB

    from pymongo import MongoClient mc = MongoClient('localhost',27017) db = mc.users db.users.save({'na ...

  4. HDU 4598

    这道题其实不需要考虑具体数值,但可以肯定的是,相连边的两端点必定有一正一负,至于谁正谁负,并不重要,这是可以思考的,很明显的一个二分图性质,如果不满足此条件,是不可能满足题目第二个条件的.所以首先对题 ...

  5. 小米红米1S 电信/联通版 专用TWRP2.8.1.1中文版 (全屏触摸/支持MTP挂载内外置存储)

    转载请注明出处和链接: http://blog.csdn.net/syhost/article/details/39340477 说说中文TWRP的简史:          中文TWRP是本人在201 ...

  6. Linux gadget驱动分析1------驱动加载过程

    为了解决一个问题,简单看了一遍linux gadget驱动的加载流程.做一下记录. 使用的内核为linux 2.6.35 硬件为芯唐NUC950. gadget是在UDC驱动上面的一层,如果要编写ga ...

  7. 浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程【转】

    本文转载自:http://www.cnblogs.com/qingchen1984/p/7007631.html 本篇文章主要介绍了"浅析 Linux 中的时间编程和实现原理一—— Linu ...

  8. 【撸码caffe 五】数据层搭建

    caffe.cpp中的train函数内声明了一个类型为Solver类的智能指针solver: // Train / Finetune a model. int train() { -- shared_ ...

  9. IJ:Idea 常用代码

    ylbtech-IJ:Idea 常用代码 1.返回顶部 1. 1.JeePlus/代码生成器http://localhost:8081/a/login 2.manager/Java基础框架http:/ ...

  10. Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements

    Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements 开始想写一个 ...