在跨越多行的块中粘贴后,默认情况下您似乎只能编辑最后一行。编辑其他行的快捷方式是什么(前面有' ...
')?
答案 0 :(得分:6)
另一种方法是不直接将多行块粘贴到shell中。相反,您可以使用edit
帮助程序。
在主目录中的.mongorc.js
文件中,您可以定义要使用的编辑器:
EDITOR="vim"
然后在shell中你可以发出edit
命令
edit foo
这将显示一个空白页面,您可以将foo
设置为查询文档
{ name: "bar" }
一个功能
function foo() {
print("BAR!");
}
或者可能最有用的是聚合查询
[
{
$match: {
name: "bar"
}
},
{
$group: {
_id: null,
ageSum: {
$sum: "$age"
}
}
},
{
$project: {
_id: 0,
n: "$name",
a: "ageSum"
}
}
]
db.test.aggregate(foo)
答案 1 :(得分:4)
如果您处于正常模式,抱歉,您无法粘贴多行,然后可以在执行前编辑中间的一行。这是在解释器中使用行编辑器的限制 - 只要您点击返回,就会触发命令行解释。
在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 var,但它在两个位置 - 首先来自javascript范围,然后是常规流程环境变量中。使用" vim"例如,执行" var EDITOR =' vim&#39 ;;"在mongo shell的javascript解释器中设置它,或执行" export EDITOR = vim"在打开mongo shell之前,在你的unix shell(或.bashrc等)中。
下一个区别是,当您从编辑器中保存并退出时,它会返回到常规的mongo shell处理并执行" var_name =<您在编辑器中完成的代码>&# 34; 。所以它可以是一个var,它可以是一个函数,它可以是一个语句,它可以是多个语句,但它可能不完整。假设您只想提供一段完整的代码,这与通常的mongo命令行解释器不同,等待直到你A)通过一个封闭的语法完成代码(例如没有未关闭的括号)或B)输入两个空表示您要放弃开始编写的命令的行。
在开始编辑时,您不必将任何重要内容分配给您指定的var。这样做可能是一个有用的习惯用法,但实现并不需要它。您可以执行任何常规数据库命令,设置变量,函数对象等。要演练打开mongo shell,如果尚未设置EDITOR,则通过键入"来启动外部编辑器。编辑foo"然后按Enter键,然后在外部编辑器会话中插入并保存以下代码示例(使用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.";
}
保存并退出后,该代码将在javascript解释器中执行,其范围与提示相同。回到通常模式,您可以看到foo只是设置为第一个语句的结果,并且所有其他创建的对象(javascript vars,functions和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
答案 2 :(得分:1)
在mongoshell中粘贴多行命令时,按Enter键时,您会看到Set<String> removalSet = new HashSet<String>();
removalSet.add(entry.getKey());
map.keySet().removeAll(removalSet);
原因:
解决方案:
答案 3 :(得分:0)
对于那些想知道为什么在shell上键入edit
无效的人,这是因为您需要为该编辑添加一个值,如下所示:
edit <something>
可以是任何类似edit input
的东西,都可以将文档的内容输入到编辑器的文档中,然后像db.collection.insert(input)
这样保存和使用(假设名称为input
否则,您会得到
ReferenceError: edit is not defined :