私は次のC#モデルクラスを持っています:
public class Thingy
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public DateTime TimeCreated { get; set; }
public string Content { get; set; }
public string UUID { get; set; }
}
および次のASP.MVCコントローラーアクション:
public ActionResult Create(Thingy thing)
{
var query = Query.EQ("UUID", thing.UUID);
var update = Update.Set("Title", thing.Title)
.Set("Content", thing.Content);
var t = _collection.Update(query, update, SafeMode.True);
if (t.UpdatedExisting == false)
{
thing.TimeCreated = DateTime.Now;
thing.UUID = System.Guid.NewGuid().ToString();
_collection.Insert(thing);
}
/*
var t = _collection.FindOne(query);
if (t == null)
{
thing.TimeCreated = DateTime.Now;
thing.UUID = System.Guid.NewGuid().ToString();
_collection.Insert(thing);
}
else
{
_collection.Update(query, update);
}
*/
return RedirectToAction("Index", "Home");
}
このメソッドは、更新または挿入を行います。挿入を行う必要がある場合は、UUIDおよびTimeCreatedメンバーを設定する必要があります。更新を行う必要がある場合は、UUIDとTimeCreatedをそのままにしておく必要がありますが、メンバーのタイトルとコンテンツを更新する必要があります。
コメントアウトされたコードは機能しますが、最も効率的ではないようです。FindOneを呼び出すと、それはmongodbへの1回の旅行です。次に、else句に移動すると、別のクエリと更新操作が実行されるため、mongodbにさらに2回移動します。
私が達成しようとしていることを行うためのより効率的な方法は何ですか?