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



假设我有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;

但是我不知道如何将其传递给插入。

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

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

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 分钟内找到相同的nametitlecreatedAt,则会对其执行"无操作"update(name设置为它已经是的任何内容(。 如果未找到,则执行一个insert(通过upsert(,它可以设置您要设置的所有字段,就好像它是insert一样。

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

最新更新