1

期望的行为:

在 Clojure 的代理实现中,要更新代理,不会发送新值。发送一个函数,在旧值上调用,返回值设置为Agent的新值。

这使某些事情变得容易:例如,如果我有一个队列,并且我有两个并发线程都想追加到队列中(而且我不在乎它们追加的顺序),每个线程都可以触发一个 ( fn [x] (cons x new_value)) ... 它就可以工作。然而,如果它是按值更新的,我必须进行某种比较和交换。

问题:

有没有支持这种更新的数据库?例如,我最近在看 MongoDB。但是,MongoDB 仅支持 $inc/$dec,不支持用于更新文档的任意函数。

谢谢!

PS——我不需要事务/ACID/BASE/……我真正想要的只是一个简单的文档存储,它支持通过函数而不是值进行更新。

4

1 回答 1

0

MongoDB 实际上支持多种不同的修饰符操作(此处为完整列表),虽然我可以看到单独的 $inc/$dec 可能会受到限制,但您给出的添加到队列的特定示例的简单变体可以使用 $push 或 $addToSet 来处理(取决于您是否希望重复项出现在队列中,因为 $addToSet 只会在它不存在的情况下添加一个值)。

对于更复杂的情况(支持比较和交换语义类型),如果您没有找到完全符合您需求的简单内容,您可以查看 MongoDB中的findAndModify 命令。

于 2012-05-02T10:27:46.753 回答