zoukankan      html  css  js  c++  java
  • Node.js 常用Mongoose方法

    Node.js 手册查询-Mongoose 方法

    一、Schema

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

    /* 定义一个 Schema */
    var mongoose = require("mongoose");
    
    var TestSchema = new mongoose.Schema({
        name : { type:String },//属性name,类型为String
        age  : { type:Number, default:0 },//属性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’: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
                    });
                }
            }
        });
    });
  • 相关阅读:
    【转】C++11优化使用emplace,emplace_back
    面试经历总结
    Hive常用函数
    股票指标
    Visual Studio Code 可以翻盘成功主要是因为什么?
    openpyxl模块操作Excel
    JavaScript(二)
    前端之CSS
    ps导出ICO格式
    Qt 所有版本官方下载地址
  • 原文地址:https://www.cnblogs.com/haonanZhang/p/8306008.html
Copyright © 2011-2022 走看看