2013-10-05 74 views
2

我蒙戈DB包含以下集合名称,如MongoDB的更新多个集合

10.9.40.46 
10.9.40.47 
10.9.40.48 
10.9.40.49 
10.9.40.50 
10.9.40.51 
10.9.40.52 

在所有集合具有文件N位数,每个文件在默认情况下有共同键名为“状态”的所有文件有“身份” 1 ,当我更新我的收藏改变“身份” 1比0我用下面的查询

db.getCollection("10.9.40.46").update({"status":1},{$set:{"status":0}},false,true) 

上面的查询做工精细,但我想更新我的所有收藏品,然后我通过我的收藏名进行查询手工,所以有是我使用数据库a的MongoDB中的任何概念nd更新该数据库中的所有集合文档使用单个查询或类似的东西?我也使用循环来读取所有集合和更新文档,但由于大量的集合,我需要很长时间。

回答

7

不,没有API可以使用单个命令对多个集合执行相同的操作。这是因为您通常不会像使用它们那样使用集合。集合用于对相同类型的文档进行分组,而不是基于内容和/或密钥进行分组。

组织文档的正常方法是将它们全部放在一个集合中,为每个文档添加一个IP地址字段,并在ip字段上创建一个索引以加快查找速度。

+0

我会说集合是“典型”的,但并不总是用于对相同类型的文档进行分组。有些情况下,将不同类型的数据放在同一个集合中是值得的。 #minorNit –

+0

如果我将所有集合文档放在单个集合中,那么我的单个集合会增加大小,而且我的代码每5分钟就会工作一次。我把新数据放入集合中,以便单个集合如何处理这种情况,可能存在像写锁一样的问题? – Yogesh

+0

@yogesh收集大小不应该是一个问题。 MongoDB旨在扩展到庞大的集合大小。写锁是每个数据库,而不是每个集合。因此,使用更多集合并不会减少由于写入锁定而导致延迟操作的可能性。有关MongoDB中数据库锁定的更多信息,请参阅http://docs.mongodb.org/manual/faq/concurrency/。 – Philipp

0

你可以使用for循环相同。

var collection='10.9.40.' 
var count=46; 
var n=46; 
var url=''; 
for(i =0;i<7;i++){ 
url=""; 
n=46+i; 
url=count+n; 
db.getCollection(url).update({"status":1},{$set: 
{"status":0}},false,true) 
}