2012-09-06 148 views
1

我想通过mongos执行一个java脚本文件,将数据插入到我的分片集中。除此之外我要添加的动态变量和NULL值 -通过mongos和javascript插入数据

我想登录(手动地)到所述壳由

蒙戈主机IP:端口/管理my_script.js

我的js看起来像:

var amount = 1000000; var x = 1; var doc ='';

for (i=0; i<amount; i++) 
{ 

doc = { a: '1', b: '2', c: 'text' , d: 'x', e: 'NULL'} 
db.mycol.insert(doc); 
x=x + 1 

} 

(而“×”我可以只用“我”) 做“d”写道:“X”或只是字母“X”的价值? “e”写入文本“Null”或..让我们说“数据库NULL” 是否正确地执行该过程? (关于我如何连接到mongos /分片集)

问候

编辑: 也是非常重要的 - 我怎么能弄清楚的时候,MongoDB的/分片设置需要存储的所有数据?并平衡它?

编辑第二:

嗨罗斯,

我有一个由两个碎片(二replicasets)的分片集。目前我正在测试,因此我使用循环计数器作为分片键。 有没有办法检查JavaScript内的时间?

更新:

所以测量所需要用于存储数据的时间等于执行的JavaScript的时间? (或者由于执行mongo shell不可访问的时间)

这个假设是否可以用于测量查询响应时间? (我在哪里必须存储java脚本文件?)

+3

如果你想让d为x变量的值,并且e为null,下面是你如何在javascript中做的事情:'doc = {a:'1',b:'2',c:'text ',d:x,e:null};' – billy

+0

非常感谢;> – Tyzak

+0

你的意思是你的分片键是{“d”:1} - 如果是这样你就不会获得平衡的写分布,你的键永远在增加。 –

回答

1

您不需要保留多个计数器 - 因为您在for循环的每次迭代中增加了i。当你想要的值,而不是字符串使用id价值和null而不是字符串"NULL" - 继承人的清理循环:

var amount = 1000000; 
for (i=1; i<amount+1; i++) { 
    doc = { a: '1', b: '2', c: 'text' , d: i, e: null } 
    db.mycol.insert(doc); 
} 

至于需要多长时间储存​​/平衡你的数据 - 取决于几个因素。

首先,你的分片键是什么?它是一个随机值还是一个递增值(如时间戳)。分片键的随机模式有助于确保写入操作的均匀分布,并且如果您知道分片键的范围,则可以使用pre-split the shard来尝试确保在加载数据时保持平衡。如果分片关键字像时间戳那样增加,那么最有可能的一个分片将变为hot并且它总是位于该范围的顶端,并且将不得不拆分块并将数据迁移到其他分片。

在MongoDB英国,有几个有关分片的精彩演讲:Overview of shardingSharding best practices

更新:

关于它需要多久的碎片成为平衡 - 这取决于你的机器的负荷。平衡是一个轻量级的过程,所以应该被视为后台操作。需要注意的是,即使在数据写入mongos时,即使是分片系统,也可以通过它查询。因此,如果在数据加载过程中分片失去平衡,数据仍然可以访问 - 根据分片的负载和新数据的增加,重新平衡分片可能需要一些时间,这意味着在迁移之前需要拆分数据块。

UPDATE2

mongos的刀片是同步的,所以它需要运行该脚本的时间是花费应用插入的时间。还有其他一些关于使用getLastError的写入耐久性的选项,基本上是在写入写入时阻塞的时间。该shell透明地调用getLastError(),但language of choice的默认值是异步的,不会等待服务器响应。

在哪里存储JavaScript文件? - 那就是你 - 它的应用程序代码。大多数用户将使用他们的首选语言编写应用程序,并使用驱动程序调用mongodb。

+0

更新了答案 – Ross

+0

也更新了:> – Tyzak

+1

再次更新,希望能为您澄清事情。它可能打破了这种方式更新问题的stackoverflow礼仪! – Ross