在Mongo shell中编辑多行中的一行

时间:2015-01-17 14:06:34

标签: mongodb shell

在跨越多行的块中粘贴后,默认情况下您似乎只能编辑最后一行。编辑其他行的快捷方式是什么(前面有' ...')?

4 个答案:

答案 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);

原因:

  1. 命令未正确打开/关闭时。

解决方案:

  1. 首先通过两次按键盘上的回车/返回键从终端出来。
  2. 更正您的命令并重新粘贴。

答案 3 :(得分:0)

对于那些想知道为什么在shell上键入edit无效的人,这是因为您需要为该编辑添加一个值,如下所示:

edit <something>

可以是任何类似edit input的东西,都可以将文档的内容输入到编辑器的文档中,然后像db.collection.insert(input)这样保存和使用(假设名称为input

否则,您会得到

ReferenceError: edit is not defined :