2012-05-14 35 views
2

MongoDB的驅動程序代碼就像這個questionC#官方更新文件(替換)內陣列MongoDB中

我需要一些幫助,使用官方的MongoDB C#驅動程序編寫代碼描述我已經得到了局面。

我不僅想從文檔數組中更新一個項目,而且還想在_arrayId沒有這樣的項目時創建新項目。也不應該有兩個數組項相同_arrayId(我試圖使用AddToSet但沒有運氣)。

這是一個很頭痛的問題;我希望有更簡單的方法來實現這一點。

var actionUpdate = Update.Set("Votes.$", vote.ToBsonDocument()); 
var actionPush = Update.Push("Votes", vote.ToBsonDocument()); 
var actionPull = Update.Pull("UserId", vote.UserId); 

var querySpecific = Query.And(
    Query.EQ("_id", new ObjectId(_contentId)), 
    Query.EQ("Votes.UserId", vote.UserId)); 
var queryPromise = Query.EQ("_id", new ObjectId(_contentId)); 

MongoCollection collection = null; 

if (_type == ContentType.Promise) 
    collection = DataService.PromiseSet.Collection; 

var userVotes = collection.Count(querySpecific); 
if (userVotes == 1) 
{ 
    collection.Update(querySpecific, actionUpdate); 
} 
else if (userVotes == 0) 
{ 
    collection.Update(queryPromise, actionPush); 
} 
else 
{ 
    collection.Update(queryPromise, actionPull); 
    collection.Update(queryPromise, actionPush); 
} 

我感謝任何幫助,謝謝。

回答

1

沒有簡單的方法,但如果考慮SQL中這種類型的更新所需的工作量,並不困難。

至於你的後續,C#驅動程序返回一個SafeModeResult(確保安全模式打開)。此結果將具有一個DocumentsAffected屬性,您可以在其中查看是否發生更新。如果沒有,那麼你會想要將值插入到數組中。

+0

我用盲目的小貓用buildinq請求執行了一個小時,並完成了一些像我想要的工作。 但它看起來很糟糕=) Plz給我很好的參考閱讀關於使用SafeModeResult和審查我的代碼,如果它不會打擾你很多。 –

+0

這對我來說似乎是一個很好的解決方案。關於醜陋的問題,我希望這個問題會被隔離在一個看不到那麼多的地方。在這種情況下,只要它有效,它看起來並不重要。 –