繁体   English   中英

在Mongodb .net驱动程序中验证插入文档

[英]Validate Document on insert in Mongodb .net driver

假设我有Person数据模型:

public class Person
{
    public string Name { get; set; }
    public string Title { get; set; }
}

而且,如果在过去5分钟内插入了另一个具有相同名称和标题的文档,我想防止插入类型为Person的新文档。

因此,我添加了CreatedAt和ValidTill。

  public class Person
 {
    public string Name { get; set; }
    public string Title { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime ValidTill { get; set; }
 }

我搜索了一种机制,该机制在尝试插入重复项时会返回异常(我不想更新以前的文档)。

我认为对我有用的是:

context.People.InsertOne(person, new InsertOneOptions() {
BypassDocumentValidation = !context.People.AsQueryable().Select(x => x.Title == person.Title && 
x.Name == person.Name && x.ValidTill > person.CreatedAt).Any()});

但是,当我使用它时,尽管BypassDocumentValidation的值为false,仍然会插入重复的文档,我知道我需要使用:

DocumentValidationAction action = DocumentValidationAction.Error;

但是我不知道如何通过它插入。

您无法使用文档验证来执行此操作,但是可以构造一个更新来执行您想做的事情。

mongo shell语法中,您可以执行以下操作:

now=new Date();
nowMinus5=new Date(now-5*60*1000);
db.collection.update(
    {name:"Asya", title:"Smartie", createdAt:{$gt:nowMinus5}},
    {
        $set:{name:"Asya"},
        $setOnInsert:{createdAt:now}  /* this is where you would put other fields to insert */
    },
    { upsert:true }
)

发生的情况是,如果在5分钟内找到了与createdAt相同的nametitle ,则将对其执行“无操作” updatename设置为现有name )。 如果未找到,则执行insert (通过upsert ),它可以将要设置的所有字段设置为好像是insert

您的应用程序可以通过检查从更新返回的writeResult并将发生的消息返回给客户端/用户来确定发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM