2015-03-02 1 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 строки, где я утверждать с .Не или что-то, что не существует этот элемент и Сбрось некоторая ошибка/предупреждение. Не уверен, как это сделать, не в первую очередь, пытаясь найти этот элемент и выбросить ошибку, если она существует. Маби, это единственный способ пойти?

Предложения Anny приветствуются, они являются новыми для Mongo и MongoC# драйвера.

ответ

0

Я действительно не знаю C#, но для меня ваш код и ваше описание не совпадают. Вы говорите, что хотите выбросить ошибку, если «элемент с тем же именем параметра» (как что?) Уже существует, но в коде ваша проверка заключается в том, что в каком-то результирующем наборе есть результаты> 0, в отличие от проверки любого документа результата для определенный "элемент с тем же именем параметра". Я думаю, что вы хотите обновить документ, если у него нет поля, которое вы пытаетесь установить в документе? Вот пример того, делая это, в Монго коде оболочки, так как я не знаю, 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

WhyNot с использованием Обеспечить индекс? Я использую mongoC, но, возможно, в C# выглядит так:

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