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

Dav*_*son 3 shell mongodb

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

NoO*_*let 6

另一种方法是不直接将多行块粘贴到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)


Aki*_*ane 5

如果您处于通常模式,抱歉,您不能粘贴多行,然后在执行之前有办法在中间编辑一行。这是在解释器中使用行编辑器的限制——只要你按下回车,命令行解释就会被触发。

在 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)