mongo执行JavaScript脚本

mongo客户端有两种方式与mongodb服务进行交互,一种是mongo shell,一种是执行javascript脚本.mongo shell,平时用的比较多,但是javascript脚本却很少用.前段时间,在一个项目中通过写js脚本批量的更新了一些数据,做一下总结.

如何执行

  1. mongo host:port/database /dir/xxxx.js

示例: mongo localhost:27017/hr_assistant index.js 在index.js中先跟mongodb打个招呼,然后打印一下当前的数据库

print('hello mongodb')
// 打印连接之后的数据库
print(db);

执行结果:

MongoDB shell version v4.0.11
connecting to: mongodb://localhost:27017/hr_assistant?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3e0c8e42-57d5-429d-a00d-bad97ec95d73") }
MongoDB server version: 4.0.11
hello mongodb
hr_assistant
  1. 上述方式是通过mongo客户端直接执行一个js脚本,也可以在进入客户端的命令行交互中使用load函数去加载一个脚本

实例:

// 进入客户端
[email protected]:~/disk/panyanan/blog/mongodb$ mongo localhost:27017/hr_assistant
MongoDB shell version v4.0.11
connecting to: mongodb://127.0.0.1:27017/
// load脚本文件
> load('index.js')
hello mongodb
hr_assistant
true

注意上述两种方式都需要注意脚本的路径问题,最好是在脚本所有文件夹去执行mongo命令,省心,省事.

js脚本与mongo Shell 的不同

mongoShell是一个简化版的JavaScript Shell, 可以自由的编写javascript代码,也内置了很多属于mongodb的特有对象及方法,但是在脚本中你无法使用像 show databases、show collections、use test这种命令,需要使用客户端提供函数如db.getCollectionNames();下面这个表格是常用命令对应的函数

commands function
show dbs, show databases db.adminCommand(‘listDatabases‘)
use db db = db.getSiblingDB(‘db‘)
show collections db.getCollectionsNames()
show users db.getUsers()

还有两个在js脚本中常用的函数,print()/printjson()可以将参数打印到标准输出上。

示例 index.js:

//  因为是--nodb 形式启动的mongo客户端 所以新建一个连接
const conn = new Mongo('localhost:27017');
print(`连接: ${conn}`)
let db = conn.getDB('hr_assistant');
print(`当前数据库:${db}`);
const dbs = db.adminCommand('listDatabases');
print('显示所有的数据库:')
printjson(dbs);
const collections = db.getCollectionNames();
print(`${db}中的collections:`);
printjson(collections);
db = db.getSiblingDB('test');
print(`切换数据库为${db}`);

运行结果:

[email protected]:~/disk/panyanan/blog/mongodb$ mongo --nodb index.js
MongoDB shell version v4.0.11
连接: connection to localhost:27017
当前数据库:hr_assistant
显示所有的数据库:
{
        "databases" : [
                {
                        "name" : "admin",
                        "sizeOnDisk" : 32768,
                        "empty" : false
                },
                {
                        "name" : "config",
                        "sizeOnDisk" : 49152,
                        "empty" : false
                },
                {
                        "name" : "hr_assistant",
                        "sizeOnDisk" : 98873344,
                        "empty" : false
                },
                {
                        "name" : "local",
                        "sizeOnDisk" : 73728,
                        "empty" : false
                }
        ],
        "totalSize" : 99028992,
        "ok" : 1
}
hr_assistant中的collections:
[
        "hr_business_call_records",
        "hr_business_info_collection",
        "hr_business_info_follow",
        "hr_business_info_interviewed",
        "hr_business_info_meeting",
        "hr_business_info_planned",
        "hr_business_info_user",
        "hr_business_resume_assessment",
        "hr_business_resume_basic_work",
        "hr_business_resume_basiceducation",
        "hr_business_resume_basichealth",
        "hr_business_resume_basicinfo",
        "hr_business_resume_head_portrait",
        "hr_business_resume_jobobjective",
        "hr_business_resume_percentage",
        "hr_business_resume_workexp",
        "hr_business_sign_list",
        "hr_business_signed_result"
]
切换数据库为test

愉快的玩耍

了解了如何运行js脚本以及与mongoshell的区别,就可以在js文件中成为一个curdBoy了.因为在js文件中可以使用mongo客户端提供的所有增删改查方法,加上js内置对象/数组的方法,简直是如虎添翼.
下面是个简单的示例

const conn = new Mongo('localhost:27017');
const db = conn.getDB('test');
// 向emp集合中插入一些记录
let emps =[
  {
    ename: 'Smith',
    deptno: 20,
    job: 'salesman',
    mgr: '',
    sal: 800,
  },
  {
    ename: 'Peter',
    deptno: 30,
    job: 'manager',
    mgr: '',
    sal: 1000,
  },
  {
    ename: 'Jack',
    deptno: 40,
    job: 'president',
    mgr: '',
    sal: 3000,
  },
  {
    ename: 'Rose',
    deptno: 50,
    job: 'analyst',
    mgr: '',
    sal: 1500,
  },
]
// 批量插入
let result = db.emps.insert(emps);
print(`批量插入一写员工`)
print(result);
// 获取jack
let jack = db.emps.findOne({ename: 'Jack'});
print(`获取jack:`)
printjson(jack)
// 调整jack的薪资为5000
result = db.emps.update({_id: jack._id}, {$set: {sal: 5000}})
jack = db.emps.findOne({ename: 'Jack'});
// 更新薪资后的jack
print('更新薪资后的jack:')
printjson(jack)
// 获取所有的员工
emps = db.emps.find({});
print('获取所有的员工:');
// 更新所有员工的领导为jordan
emps.forEach(function(emp) {
  printjson(emp);
  emp.mgr = 'Jordan';
  db.emps.save(emp)
});

emps = db.emps.find({});
print('更新所有员工的领导为jordan');
while(emps.hasNext()) {
  printjson(emps.next())
}
result = db.emps.remove({});
print(`删除员工:: ${result}`);

运行结果

[email protected]:~/disk/panyanan/blog/mongodb$ mongo --nodb curd.js
MongoDB shell version v4.0.11
批量插入一写员工
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 4,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
获取jack:
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6c"),
        "ename" : "Jack",
        "deptno" : 40,
        "job" : "president",
        "mgr" : "",
        "sal" : 3000
}
更新薪资后的jack:
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6c"),
        "ename" : "Jack",
        "deptno" : 40,
        "job" : "president",
        "mgr" : "",
        "sal" : 5000
}
获取所有的员工:
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6a"),
        "ename" : "Smith",
        "deptno" : 20,
        "job" : "salesman",
        "mgr" : "",
        "sal" : 800
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6b"),
        "ename" : "Peter",
        "deptno" : 30,
        "job" : "manager",
        "mgr" : "",
        "sal" : 1000
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6c"),
        "ename" : "Jack",
        "deptno" : 40,
        "job" : "president",
        "mgr" : "",
        "sal" : 5000
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6d"),
        "ename" : "Rose",
        "deptno" : 50,
        "job" : "analyst",
        "mgr" : "",
        "sal" : 1500
}
更新所有员工的领导为jordan
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6a"),
        "ename" : "Smith",
        "deptno" : 20,
        "job" : "salesman",
        "mgr" : "Jordan",
        "sal" : 800
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6b"),
        "ename" : "Peter",
        "deptno" : 30,
        "job" : "manager",
        "mgr" : "Jordan",
        "sal" : 1000
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6c"),
        "ename" : "Jack",
        "deptno" : 40,
        "job" : "president",
        "mgr" : "Jordan",
        "sal" : 5000
}
{
        "_id" : ObjectId("5d44fdd70998b36ed6983e6d"),
        "ename" : "Rose",
        "deptno" : 50,
        "job" : "analyst",
        "mgr" : "Jordan",
        "sal" : 1500
}
删除员工:: WriteResult({ "nRemoved" : 4 })

原文地址:https://www.cnblogs.com/pandapeter/p/11294232.html

时间: 2024-10-11 22:40:15

mongo执行JavaScript脚本的相关文章

Selenium执行Javascript脚本使用参数和返回值

在Selenium中可以使用drvier.execute_script()来执行Javascript脚本,支持多行语句. 使用Javascript可以实现以下功能: 移除元素隐藏.禁用.只读等限制属性 为元素添加id或高亮样式 页面滚动 富文本框输入(HTML注入) 获取页面信息 使用Javascript参数 在使用Javascript语句时,还可以动态传入参数或元素对象,Javascript语句中使用占位符"argument[n]"来表示取第几个参数,如: js = "ar

JQuery html API支持解析执行Javascript脚本功能实现-代码分析

JQuery html用法(功能类似innerHTML) 开发中需要使用Ajax技术来更新页面局部区域, 使用的方法是ajax获取html代码段(字符串),然后将这个html代码段作为参数,传入目标DOM(JQuery对象)的JQuery html接口,此语句执行后, 会将html代码段解释执行, 显示出html代码段描述的页面控件. 例如: <html> <head> <script type="text/javascript" src="./

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本,更多内容请参考:Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('https://www.baidu.com/') #给搜索输入框标

MongoDB源码分析——mongo与JavaScript交互

mongo与JavaScript交互 源码版本为MongoDB 2.6分支     之前已经说过mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,执行js其实就是一个js和c++互相调用的过程,当然,因为mongo采用了Google V8 JS引擎,所以调用的实现的核心都由V8实现了,本篇只是分析了mongo是如何使用V8实现功能,对V8的源码不做分析. 为了了解mongo是如何使用js,我们首先从connect说起: mongo::ScriptEngine::set

浅谈解决浏览器不执行javascript的问题

昨天写了一个网站,在PC端的chrome浏览器以及苹果手机,以及安卓手机中的部分QQ浏览器都完美运行,但是在IE11以及其他的一些手机浏览器上运行时发现javascript根本没有调用. 我在网上找了很久也没有找到解决方案,网上很多说在设置,Internet选项->允许运行xxxxx,我的浏览器都是允许执行javascript脚本的. 到底是怎么回事呢,后来我在IE浏览器运行时查看控制台才发现,原来是我的js代码中使用了ES6的模板字符串拼接,有很多浏览器都还不支持该语法,因此浏览器认为我的js

SpiderMonkey-让你的C++程序支持JavaScript脚本

译序 有些网友对为什么D2JSP能执行JavaScript脚本程序感到奇怪,因此我翻译了这篇文章,原文在这里.这篇教程手把手教你怎样利用SpiderMonkey创建一个能执行JavaScript脚本的C++程序,并让JavaScript脚本操纵你的C++程序的内部数据.操作.从这篇教程能够看到在SpiderMonkey引擎的帮助下,让C++程序支持JavaScript脚本是一件非常easy的事,更棒的是SpiderMonkey也能够在Macintosh和Unix平台使用.SpiderMonkey

MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询. >db.runCommand({"drop":"test"}) 上面的命令等价于下面的查询: >db.$cmd.findOne({"d

[Swift通天遁地]一、超级工具-(5)使用UIWebView(网页视图)加载本地页面并调用JavaScript(脚本)代码

本文将演示如何使用UIWebView(网页视图)读取项目中的网页文件,以及执行JavaScript脚本代码. 在项目文件夹[DemoApp]上点击鼠标右键,弹出右键菜单. [New File]->[Blank]空白模板->[next] ->[Save As]:Register.html->[Create] 在Register.html中输入网页代码: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta h

浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及其他的细节问题.而除了defer和async特性,动态脚本和Ajax脚本注入也是两种常用的创建无阻塞脚本的方法.总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机还是有一定差异,今天我们再来探讨一下通过动态脚本技术和Ajax注入的脚本在这些方