2017-08-28 99 views
0

我有一个收集器模块,每隔30秒就会提取一个远程API。 这给我一个我在MongoDB数据库中插入或更新的对象列表。使用Golang更新MongoDB中没有循环的文档

{ 
    "id" : "oulkhhvoiupokb", 
    "name" : "test1", 
    "status" : "OPEN" 
}, 
{ 
    "id" : "oulkhhvoisksbsjkkb", 
    "name" : "test2", 
    "status" : "CLOSED" 
} 

实际上,我只收集具有OPEN状态的对象。随着循环,我将对象的其余部分设置为CLOSED(因为它们不是OPEN)。 但是将来会花费很多时间,因为对象的长度会增长。

我使用Golang和MGO软件包。

请问有办法更快更清洁吗?像为Mongo文档设置基本字段值?要解释它的不同之处,当我将OPEN对象插入到数据库中时,其他已经在数据库中的所有对象都必须是CLOSED。 Mongo能做到吗?

谢谢。

+0

你想要做什么?将状态更改为不是“OPEN”的所有文档的“CLOSED”(当然还没有“CLOSED”)? – icza

+0

请参阅[“multi”](https://docs.mongodb.com/manual/reference/method/db.collection.update/#multi-parameter)中的'.update()'选项。这同样适用于每种语言实施的驱动程序。可能比“字符串”好一点的是,如果只有一个项目意味着使用['$ bit'](https://docs.mongodb.com/manual/reference/operator/update/bit/)与'xor'被“打开”。使用'$ bit'你可以做一个更新语句,而不是两个。但是价值需要是“数字”而不是。 –

+0

感谢您的帮助。从远程API中,我只抽取OPEN对象,因为它是我需要的非常快速的信息。收集到的数据,我知道我的数据库中所有不在我从远程API获得的对象列表中的文档都是关闭的,因为它们不在OPEN列表中。所以我执行一个循环来将'.update()'作为CLOSED。我的需要是不要执行循环并将所有不在OPEN列表中的对象设置为CLOSED。 – Elwyn

回答

0

解决方法是使用func (c *Collection) UpdateAll(selector interface{}, update interface{}) (info *ChangeInfo, err error)$nin用于选择器,$set用于更新。