我们假设我有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;
但我无法想象如何将其传递给插入。
答案 0 :(得分:0)
您不能使用文档验证来执行此操作,但是可以构造一个更新来执行您想要做的事情。
在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分钟内找到了与name
相同的title
和createdAt
,则对其执行“无操作” update
( name
设置为已经存在的任何值)。如果找不到,则执行insert
(通过upsert
),它可以将要设置的所有字段都设置为好像是insert
。
您的应用程序可以通过检查更新返回的writeResult并将发生的消息返回给客户端/用户来确定发生了什么。