2017-04-07 36 views
1

我在Go中運行網站,並使用MGO包與我的MongoDB數據庫連接。Golang MGO - 插入或更新不能按預期工作

我正在處理用戶的登錄,並且我試圖使用func Upsert()更新用戶,如果它們存在於數據庫中,請將其插入。

問題是,當我運行Upsert()(下面的代碼)時,它會替換所有字段而不是隻更新第二個參數bson.M{}中的當前字段。

db.C("users").Upsert(
    bson.M{"email": "[email protected]"}, // Which doucment to upsert 
    bson.M{"displayName": "Johhny"}, // What to replace 
) 

的什麼,我試圖解釋一個可視化的例子。

現有的數據庫文件:

{ 
    "_id" : ObjectId("58e7589bab64da55ebcf5d25"), 
    "email" : "[email protected]", 
    "password" : "", 
    "age": 69, 
    "displayName" : "Someone!" 
} 

運行後:

db.C("users").Upsert(
    bson.M{"email": "[email protected]"}, 
    bson.M{"displayName": "My name was updated"}, 
) 

文件變爲:

{ 
    "_id" : ObjectId("58e789feab64da55ebcf691c"), 
    "displayName" : "My name was updated" 
} 

當我預計該文檔以:

{ 
    "_id" : ObjectId("58e7589bab64da55ebcf5d25"), 
    "email" : "[email protected]", 
    "password" : "", 
    "age": 69, 
    "displayName" : "My name was updated" // This should be updated, all others should be left untouched 
} 

最後是我的問題。

如何更新文檔,如果它已經存在於MongoDB集合中,否則插入它?

回答

2

如果您嘗試使用您提供的字段更新文檔並忽略所有其他字段,那麼我認爲如果沒有選擇第一個字段,這是不可能的。

See this question on stack overflow

編輯: 嘗試:

db.C("users").Upsert( bson.M{"email": "[email protected]"}, bson.M{"$set": bson.M{"displayName": "My name was updated"}}, )

+0

你是說我需要做兩個查詢到MongoDB的?選擇,然後檢查錯誤(如果它不存在則更新)/如果它存在則插入)類似的東西? – Acidic

+0

對不起,我想不明白,你需要使用'$ set'運算符 類似於: 'bson.M {「$ set」:bson.M {「displayName」:「我的名字已更新」}}' – Zak

+0

Just測試,,,它的作品。謝謝! :) – Acidic