2017-08-28 102 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用於更新。