2015-03-02 71 views
0

如果具有相同參數的元素已儘可能少地存在查詢,我想更新嵌入式文檔並引發錯誤。如果嵌入式文檔插入時存在元素,則拋出錯誤

我試了下面。 :

public void AddUrlToList(Url url, Guid playListId) 
{ 
    MongoCollection<PlayList> collection = GetPlayListForEdit(); 
    try 
    { 
     //DO better solution here... 
     var query = Query.EQ("UrlList.Url", url.UrlPart); 
     var items = collection.Find(query).ToList(); 
     if (items.Count > 0) 
      throw new Exception(); 

     //collection.Update(Query.And(Query<PlayList>.EQ(e => e.Id, playListId), Query.NE("UrlList", url.UrlPart)), Update.AddToSetWrapped("UrlList", url), WriteConcern.Acknowledged); 
     collection.Update(Query<PlayList>.EQ(e => e.Id, playListId), Update.AddToSetWrapped("UrlList", url)); 
    } 
    catch (MongoCommandException ex) 
    { 
     string msg = ex.Message; 
    } 
} 

文件:

public class PlayList 
    { 
     [BsonId(IdGenerator = typeof(CombGuidGenerator))] 
     public Guid Id { get; set; } 

     [BsonElement("Name")] 
     public string Name { get; set; } 

     [BsonElement("Owner")] 
     public Guid Owner { get; set; } 

     [BsonElement("UrlList")] 
     public List<Url> UrlList { get; set; } 

     //Curret URL info. 
     [BsonElement("CurrentUrl")] 
     public string CurrentUrl { get; set; } 
     [BsonElement("version")] 
     public Guid version { get; set; } 
     [BsonElement("time")] 
     public string time { get; set; } 
     [BsonElement("isRepeat")] 
     public bool isRepeat { get; set; } 
    } 
public class Url 
{ 
    [BsonElement("Url")] 
    public string UrlPart { get; set; } 

    [BsonElement("Title")] 
    public string Title { get; set; } 
} 

但是我寧願想要做的outcommented排在那裏我有.NE什麼斷言風格的東西,這個元素不存在和thow某種錯誤/警告。不確定如何在沒有首先嚐試查找此元素並拋出錯誤(如果存在)的情況下執行此操作。 Mabey是唯一的出路嗎?

安妮的建議,歡迎來到Mongo和MongoC#驅動程序。

回答

0

我並不真正瞭解C#,但對我而言,您的代碼和您的描述不匹配。你說如果「一個具有相同參數名稱的元素」(如?)已經存在,但在代碼中,如果某個結果集具有> 0的結果,則檢查爲錯誤,而不是檢查任何結果文檔某個「具有相同參數名稱的元素」。我想你只想更新一個文件,如果它沒有你想要在文件上設置的字段?下面是一個在mongo shell代碼中這樣做的例子,因爲我不太瞭解C#:

> db.test.drop() 
> db.test.insert({ "_id" : 0, "flavor" : "vanilla" }) 
> db.test.insert({ "_id" : 1 }) // no flavor 
> db.test.update({ "_id" : 0, "flavor" : { "$exists" : false } }, 
       { "$set" : { "flavor" : "chocolate" } }) 
// no documents update - flavor field existed in doc w/ _id 0 
> db.test.update({ "_id" : 1, "flavor" : { "$exists" : false } }, 
       { "$set" : { "flavor" : "chocolate" } }) 
// doc w/ _id 1 updated 
> db.test.find().pretty() 
{ "_id" : 0, "flavor" : "vanilla" } 
{ "_id" : 0, "flavor" : "chocolate" } 
0

使用Ensure索引?我正在使用mongoC,但也許在c#中是這樣的:

collection.EnsureIndex(new IndexKeysBuilder() 
.Ascending("UrlList.Url"), IndexOptions.SetUnique(true));