期望的行为:
在Clojure的代理实现中,为了更新代理,不会发送新值。一个发送一个函数,该函数在旧值上调用,返回值被设置为代理的新值。
这使得某些事情变得简单:例如,如果我有一个队列,并且我有两个并发线程都想要追加到队列中(我不关心它们追加的顺序),每个线程都可以解雇关闭a(fn [x](cons x new_value))......它只是起作用。然而,如果按值更新,我必须进行某种比较和交换。
问题:
是否有支持此类更新的数据库?例如,我最近在看MongoDB。但是,MongoDB仅支持$ inc / $ dec,而不支持更新文档的任意函数。
谢谢!
PS - 我不需要事务/ ACID / BASE / ...我真正想要的是一个简单的文档存储,它支持通过函数而不是值进行更新。
答案 0 :(得分:0)
MongoDB实际上支持多个不同的修饰符操作(完整列表here),虽然我可以看到单独的$ inc / $ dec可能是限制的,但是您可以处理添加到队列的特定示例的简单变体使用$ push或$ addToSet(取决于你是否希望重复项出现在你的队列中,因为$ addToSet只会添加一个值,如果它还不存在的话)。
对于更复杂的情况(支持比较和交换类型的语义),如果找不到符合您需求的简单内容,可以查看MongoDB中的findAndModify command。