Ravendb 仅当值不';还不存在吗?

Ravendb 仅当值不';还不存在吗?,ravendb,Ravendb,在ravendb中,我试图解决一个竞争条件,即可以同时将多个URL添加到单个文档中。为了安全地执行此操作(并且不在集合中创建重复条目),我需要在数据库中原子地执行条件检查和数组推送。例如,结构可能如下所示: public class MyData { public string Id { get; set; } public List<string> Urls { get; set; } } 我在看补丁,但我不知道如何添加条件。有人能给我举个例子说明我该怎么做吗 更

在ravendb中,我试图解决一个竞争条件,即可以同时将多个URL添加到单个文档中。为了安全地执行此操作(并且不在集合中创建重复条目),我需要在数据库中原子地执行条件检查和数组推送。例如,结构可能如下所示:

public class MyData
{
    public string Id { get; set; }
    public List<string> Urls { get; set; }
}
我在看补丁,但我不知道如何添加条件。有人能给我举个例子说明我该怎么做吗

更新

这是我目前正在使用的

var listing = _session.Query<ListingData>()
    .Where(l => l.ListingId == listingId && l.OwnerId == userId)
    .ToList().SingleOrDefault();

if (listing == null)
    return DataResult.NotFound;

_session.Advanced.Patch(
    listing,
    l => l.PhotoUrls,
    urls => urls.Add(url));

_session.SaveChanges();
var list=\u session.Query()
.Where(l=>l.ListingId==ListingId&&l.OwnerId==userId)
.ToList().SingleOrDefault();
if(清单==null)
返回DataResult.NotFound;
_session.Advanced.Patch(
表册
l=>l,
url=>url.Add(url));
_session.SaveChanges();
如果一切都进展顺利,现在看来这是可行的,但是如果有一些情况发生,例如,基于假阴性的应用程序端重试,那么我想我会得到重复的结果,因为

  • 为了获得实体/id,我必须做一次往返
  • 该操作只是简单地添加该值,而不首先检查该值是否存在

只需使用补丁脚本即可

using (var session = store.OpenSession())
{    
    var listing = _session.Query<ListingData>()
      .Where(l => l.ListingId == listingId && l.OwnerId == userId)
      .ToList().SingleOrDefault();

    session.Advanced.Defer(new PatchCommandData(
       id: listing.ListingId,
       changeVector: null,
       patch: new PatchRequest
       {
          Script = @"
             if (this.PhotoUrls.includes(url))
                   throw ‘Url already exists’;
             this.PhotoUrls.push($newUrl);
          ",
          Values =
          {
              ["newUrl"] = "The Url to add"
          }
       },
       patchIfMissing: null));

    session.SaveChanges();
}
使用(var session=store.OpenSession())
{    
var listing=\u session.Query()
.Where(l=>l.ListingId==ListingId&&l.OwnerId==userId)
.ToList().SingleOrDefault();
session.Advanced.Defer(新数据)(
id:listing.ListingId,
changeVector:null,
补丁:新的补丁请求
{
脚本=@“
if(this.PhotoUrls.includes(url))
抛出“Url已存在”;
this.photoURL.push($newUrl);
",
价值观=
{
[“newUrl”]=“要添加的Url”
}
},
patchiffmissing:null));
session.SaveChanges();
}
见:


  • 看起来不支持
    .includes()
    。我可以用
    if(this.PhotoUrls.indexOf($newUrl)=-1)this.PhotoUrls.push($newUrl)
    替换它,我是RavenDb的新手,我没有意识到我可以在那里像那样编写香草JS。刚刚打开了一个新世界。谢谢哦-是的-没错-RavenDB使用Jint,一个支持ECMAScript 5.1的开源JavaScript解释器而includes()是ECMAScript 6。见:
    using (var session = store.OpenSession())
    {    
        var listing = _session.Query<ListingData>()
          .Where(l => l.ListingId == listingId && l.OwnerId == userId)
          .ToList().SingleOrDefault();
    
        session.Advanced.Defer(new PatchCommandData(
           id: listing.ListingId,
           changeVector: null,
           patch: new PatchRequest
           {
              Script = @"
                 if (this.PhotoUrls.includes(url))
                       throw ‘Url already exists’;
                 this.PhotoUrls.push($newUrl);
              ",
              Values =
              {
                  ["newUrl"] = "The Url to add"
              }
           },
           patchIfMissing: null));
    
        session.SaveChanges();
    }