gpt4 book ai didi

c# - 在 mongodb 中执行高效的 upsert

转载 作者:可可西里 更新时间:2023-11-01 10:34:12 26 4
gpt4 key购买 nike

我有以下 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 Controller 操作:

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,但必须更新成员 Title 和 Content。

注释掉的代码有效,但似乎不是最有效的。当它调用 FindOne 时,这是到 mongodb 的一次旅行。然后,如果转到 else 子句,它会执行另一个查询和更新操作,因此还有 2 次访问 mongodb。

什么是完成我想要完成的事情的更有效方法?

最佳答案

如链接的 SO 答案中所述,要使更新插入起作用,您需要更新整个文档,而不仅仅是几个属性。

我个人会将 CreateEdit 分开到单独的 MVC 操作中。建议零售价。创建 Thingy 与更新它有不同的注意事项。

如果您仍想执行更新插入而不是单独的插入/更新调用,则需要使用以下代码:

_collection.Update(
Query.EQ("UUID", thing.UUID),
Update.Replace(thing),
UpsertFlags.Upsert
);

现在的问题是,我们如何确保 thing 对两种情况(即插入和更新)都具有适当的值。

我的假设是(基于您的代码模型绑定(bind)到 Thingy 实例),您的 View 正在发回所有字段(包括 UUIDTimeCreated)。这意味着,在更新的情况下, View 已经为 UUIDTimeCreated 预填充了值。因此,在更新 Thingy 的情况下,thing 对象具有最新值。

现在,在创建的情况下,当呈现 View 时,您可以为 TimeCreated 字段存储 DateTime.MinValue。在您的 Create MVC 操作中,您可以检查 TimeCreated 是否为 DateTime.MinValue,然后将其设置为当前时间并存储一个新值UUID

这样,在插入的情况下,thing 也具有最新值。因此,我们可以安全地进行更新插入。

关于c# - 在 mongodb 中执行高效的 upsert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com