mongodb - mongo shell 的同步/异步属性是什么?

标签 mongodb asynchronous

我习惯于 JavaScript 是非阻塞/异步的,尤其是在 IO 方面。这就是为什么 mongo shell 有点奇怪的原因。以 MongoDb: The Definitive Guide 中的这个例子为例:

(从第 31 页开始):


例如,假设我们插入一百万个具有以下内容的虚拟元素:

> for (var i = 0; i < 1000000; i++) {
... db.tester.insert({"foo": "bar", "baz": i, "z": 10 - i}) ... }

现在我们将尝试删除我们刚刚插入的所有文档,测量所花费的时间。首先,这是一个简单的删除:

> var timeRemoves = function() {
... var start = (new Date()).getTime();
...
... db.tester.remove();
... db.findOne(); // makes sure the remove finishes before continuing ...
... var timeDiff = (new Date()).getTime() - start;
... print("Remove took: "+timeDiff+"ms");
... }
> timeRemoves()

看到 db.findOne() 的评论了吗?那是直接从文本中得出的。像这样颠簸流对我来说并不奇怪,但这是你不知道的事情,直到你花了很长时间试图找出你期望工作的东西出了什么问题。

那么,mongo shell 的异步/同步处理是什么?我应该如何知道会发生什么,以及何时以及如何增加 IO 操作,例如上面那个。这在任何地方都有记录吗?有什么方法可以让它异步工作,就像 JS 通常的行为一样?我知道这对于 REPL 来说很奇怪,但仍然......

最佳答案

我依靠 mongo shell 来执行数据库迁移。我迁移的正确性在很大程度上取决于 mongo shell 命令是同步的还是异步的。

我在文档中找不到任何东西😔,所以我写了一个测试脚本:

var ops = [];
var numDocs = 1e5;

var time1 = +new Date();
for (var i = 0; i < numDocs; i++) {
  ops.push({
    insertOne: {
      document: {
        test: 'test',
      }
    }
  });
}
db.test_obj.bulkWrite(ops);
var time2 = +new Date();
var count1 = db.test_obj.count();

db.test_obj.update({}, {$set: {test: 'test2'}}, {multi: true});

var countA = db.test_obj.find({test: 'test'}).count();
var countB = db.test_obj.find({test: 'test2'}).count();
print('Inserting ' + numDocs.toString() + ' documents took: ' + ((time2 - time1) / 1000).toString() + 's');
print(count1);
print(countA);
print(countB);

输出:

> mongo --host <HOST> test-2.js
<MONGO INIT OUTPUT>
Inserting 100000 documents took: 16.258s
100000
0
100000

据此我推测 mongo shell 中的所有操作都是同步的——尽管没有这样的保证!可能有一些操作不是同步的,或者我的脚本中的某些条件使它看起来是同步的。

逻辑是,如果例如.bulkWrite().update() 是异步的,之后调用 .count() 将返回一个小于 100,000 的数字。但是,另一种可能的解释是 .count() 正在追赶,在插入/更新文档时循环遍历集合。

关于mongodb - mongo shell 的同步/异步属性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24255612/

相关文章:

c# - Mongodb:如何检查一个点是否包含在多边形中?

javascript - 异步调用和更新变量

javascript - MongoDB $geoNear 距离返回值精度下降

java - 玩! 2 Framework - 添加Java Mongo驱动

javascript - Mongo --quiet 不抑制 --eval 输出

python - 如何编写测试并发性的 Tornado 单元测试

javascript - 仅使用异步 XHR 请求解析 JSON 时出错

mongodb - 调用包裹在docker中的mongodump

javascript - 异步模板加载

node.js - 在 Mongoose 中存储 "findOne"的值并使用 "find"插入返回值