在跨越多行的块中粘贴后,默认情况下您似乎只能编辑最后一行.编辑其他行(以' ...' 开头)的快捷方式是什么?
另一种方法是不直接将多行块粘贴到shell中.相反,您可以使用edit帮助程序.
在.mongorc.js主目录中找到的文件中,您可以定义要使用的编辑器:
EDITOR="vim"
Run Code Online (Sandbox Code Playgroud)
然后在shell中,您可以发出edit命令
edit foo
Run Code Online (Sandbox Code Playgroud)
这将显示一个空白页面,您可以将其设置foo为查询文档
{ name: "bar" }
Run Code Online (Sandbox Code Playgroud)
一个功能
function foo() {
print("BAR!");
}
Run Code Online (Sandbox Code Playgroud)
或者最有用的是聚合查询
[
{
$match: {
name: "bar"
}
},
{
$group: {
_id: null,
ageSum: {
$sum: "$age"
}
}
},
{
$project: {
_id: 0,
n: "$name",
a: "ageSum"
}
}
]
Run Code Online (Sandbox Code Playgroud)
db.test.aggregate(foo)
如果您处于通常模式,抱歉,您不能粘贴多行,然后在执行之前有办法在中间编辑一行。这是在解释器中使用行编辑器的限制——只要你按下回车,命令行解释就会被触发。
在 bash shell 中,您可以使用 edit-and-execute-command 命令(默认绑定到 [Ctrl-x, Ctrl-e])为您提供一个普通的文件编辑器,让您可以自由工作,而不会在每次结束时触发命令执行线。
正如 NoOutlet 指出的那样,mongo shell 可以做一些与edit var_name shell 命令非常相似的事情。如果您知道 bash shell 的 [Ctrl-x, Ctrl-e] 技巧并想了解使用编辑 var_name模式时的差异,请继续阅读。
我注意到的第一个区别是没有控制键绑定 - 您只能通过在新提示的开头键入edit var_name来启动它。
您可能知道在 bash 情况下,它会尝试查找并打开在 $VISUAL 或 $EDITOR 环境变量中命名的编辑器程序,或者使用“emacs”作为失败。mongo shell 将只查找 EDITOR 变量,但它会在两个地方这样做——首先是从 javascript 范围,然后是在常规流程环境变量中。以“vim”为例,只需执行“var EDITOR = 'vim';” 在 mongo shell 的 javascript 解释器中设置它,或者在打开 mongo shell 之前在你的 unix shell(或 .bashrc 等)中执行“export EDITOR=vim”。
下一个区别是,当您保存并退出编辑器时,它会返回到常规的 mongo shell 处理并执行"var_name = <the code in you completed in your editor>"。所以它可以是var,可以是函数,可以是语句,可以是多个语句,但不能是不完整的。假设您只想提供一段完整的代码,这与通常的 mongo 命令行解释器不同,它会等到您 A) 通过使用一段封闭的语法(例如,没有未封闭的括号)或 B) 输入两个空来完成您的代码行表示您想放弃您开始编写的命令。
您不必将任何重要的内容分配到您在开始编辑器时命名的 var 中。这样做可能是一个有用的习惯用法,但实现并不需要它。您可以执行任何常规数据库命令、设置变量、函数对象等。要进行演练,请打开 mongo shell,如果尚未设置,则设置 EDITOR,然后键入“edit foo”并按回车键启动外部编辑器,然后在外部编辑器会话中插入并保存以下代码示例(您使用 vim/emacs/nano 等)
999; //this is the only thing that will be evaluated into "foo"
db.new_test.insert({"junk": 1});
var colNames = db.getCollectionNames();
function mongoSystemColFilter(x) {
return x.substring(0,7) == "system.";
}
Run Code Online (Sandbox Code Playgroud)
保存并退出后,该代码将在与提示相同的范围内的 javascript 解释器中执行。回到通常模式,您可以看到 foo 只是设置为第一条语句的结果,并且创建的所有其他对象(javascript 变量、函数和 db 对象)仍然在作用域中可用。
> print(foo);
999
> for (i in colNames) {
... var cnm = colNames[i];
... if (mongoSystemColFilter(cnm)) {
... print("Ignoring [" + cnm + "] because it is a system collection");
... } else {
... print("Okay, found our [" + cnm + "] collection");
... }
... }
Okay, found our [new_test] collection
Ignoring [system.indexes] because it is a system collection
> db.new_test.drop()
true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8200 次 |
| 最近记录: |