作为学习RavenDB的一部分,我试图根据我每晚下载的列表更新一组股票.
我有一个Stock类,其中Id是股票代码:
public class Stock { public string Id { get; set; } public StockStatus Status { get; set; } }
我正在尝试使用此算法同步列表:
更新或插入现在下载的所有股票为"StillActive".
任何上次状态为"活跃"的股票意味着他们不在更新中,需要"删除".
所有股票仍然"StillActive"成为新的"活跃"股票.
这是实施:
Liststocks = DownloadStocks(); using (var session = RavenContext.Store.OpenSession()) { foreach (Stock stock in stocks) { stock.Status = StockStatus.StillActive; session.Store(stock); } session.SaveChanges(); session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:Active", "Status", StockStatus.Deleted); session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:StillActive", "Status", StockStatus.Active); }
PatchUpdateCutoffNow是一个扩展方法,它使用Cutoff现在执行UpdateByIndex:
public static void PatchUpdateCutoffNow(this IDocumentSession session, string indexName, string query, string name, object val) { session.Advanced.DatabaseCommands.UpdateByIndex(indexName, new IndexQuery() { Query = query, Cutoff = DateTime.Now }, new[] { new PatchRequest { Type = PatchCommandType.Set, Name = name, Value = val.ToString() } }); }
我最终得到了很多不应该被删除的股票.我的猜测是SaveChanges是异步的,并且在PatchUpdateCutoffNow启动时没有完成,因此当它们应该是"活动"时,我最终得到一些状态为"已删除"的股票.我想IndexQuery截止值不适用,因为SaveChanges不直接反对"Stocks/ByStatus"索引.
有没有办法让SaveChanges同步或以其他方式做到这一点,更符合NoSQL/RavenDB的思维方式?
文档立即存储,但补丁命令适用于尚未更新的索引.也许这有助于插入SaveChanges()
和修补:
using (var s = RavenContext.Store.OpenSession()) { s .Query("Stocks/ByStatus") .Customize(c => c.WaitForNonStaleResultsAsOfNow()) .Take(0) .ToArray(); }
顺便说一句,您不需要DatabaseCommands的会话,您可以直接在商店中调用它们.