绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
MongoDB里的存储Function
2020-04-29 17:55:22
 
关系型数据库中都有存储过程,那么Mongo中有没有呢?答案是肯定有的
MongoDB的存储过程存储在db.system.js集合中,可以重复调用
格式实例:
     
db.system.js.save(
  {
    _id: "echoFunction",          ---存储名称,在每个database中是的
    value : function(x) { return x; }     ---value后的值是存储的定义,x是可接受的参数
  })

db.system.js.save(
  {
    _id : "myAddFunction" ,
    value : function (x, y){ return x + y; }     ---接受参数可以是多个
  });
存储过程可以被查看,修改和删除(使用方法与collection的方法一样)
查看:
>db.system.js.find()
{ "_id" : "echoFunction", "value" : function (x){return x;} }
{ "_id" : "myaddFunction", "value" : function (x,y){return x + y;} }
修改:
> db.system.js.update({_id:'myaddFunction'},{$set:{value:function (x,y){return x*y;}}})     
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

执行存储过程
在mongo shell中可以使用 db.loadServerScripts()  加载当前数据库下system.js中的所有存储过程,
一旦加载之后,就可以直接调用存储使用
测试:
>db.loadServerScripts()
> myaddFunction(2,3)
6
当然存储过程也可以实现非常复杂的流程运算,这就需要你把value后面的值填充的更加丰满了
注:之前版本使用db.eval()加载存储的方法,目前版本基本已经不用了(可以用但会有警告提示)

实战:
根据条件查询集合,将集合中字段的值存到数组中,并返回这个数组
>db.system.js.save(
    { 
        "_id" : "SucmsgId", 
        "value" : function (sdate) {          ---sdate为函数参数
            var tmparry = new Array();          ---定义数组
            var aa = db.SenderHis.find({ SenderStatus: "Success", cdate: { $gte: sdate } }, { messageId: 1, _id: false });     ---查询集合
            while (aa.hasNext()) {
                var bb = aa.next();          ---逐行查询
                tmparry.push(bb.messageId);     ---将每行的值存入数组中
            }
            return tmparry;          ---返回数组
        } 

    }
    )


但是官网有如下建议:

参考网址:

https://docs.mongodb.com/v3.6/tutorial/store-javascript-function-on-server/index.html
分享好友

分享这个小栈给你的朋友们,一起进步吧。

MongoDB运维笔记
创建时间:2020-04-29 16:51:41
本小栈主要是用来将我运维MongoDB过程 需要的问题,学到的知识,记录下的笔记,放到这里供大家学习探讨,如果有不正确的地方,请留言我更正,谢谢支持。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 贾建龙
    栈主

小栈成员

查看更多
  • 小雨滴
  • ?
  • 栈栈
  • yangxz
戳我,来吐槽~