我有一个playlists
集合。集合中的每个文档都包含一个entries
字段,即一个数组。
如何以原子方式更改播放列表中entries
的顺序?
(例如,如果另一个用户同时尝试 到$push
一个新条目,我想确保新条目仅在重新排序后才$push
编辑)
如果我执行find()
,然后在PHP中重新排序,然后update()
,如果操作不是原子的,我可能会丢失新的$push
ed条目。
这是一个示例播放列表对象:
{
"_id" : "playlist1",
"title" : "Playlist One",
"entries" : [
{
"class" : "song",
"identifier" : "song1"
},
{
"class" : "song",
"identifier" : "song2"
},
{
"class" : "song",
"identifier" : "song3"
}
]
}
修改
我想我找到了一个可能的解决方案,使用execute()
:
在数据库中运行JavaScript会占用写锁定,这意味着它会阻止其他操作。
(来自http://php.net/manual/en/mongodb.execute.php)
我只需要在MongoDB服务器上执行代码(find()
+ reorder()
+ update()
)。
但是,如果您有其他想法不涉及“字符串中的代码”(例如$func = "function() { do_something(); return \"something else\" }"
),请分享。
谢谢!
答案 0 :(得分:1)
使用eval()来阻止操作是当前实现的副作用,而不是依赖的功能。
MongoDB wiki有一个页面,其中包含Atomic Operations的信息。
您的用例的相关策略是"update if current":