Php 如何在MongoDB中对数组项进行原子重新排序?
我有一个Php 如何在MongoDB中对数组项进行原子重新排序?,php,mongodb,Php,Mongodb,我有一个播放列表收藏。集合中的每个文档都包含一个条目字段,即一个数组 如何原子地更改播放列表中项的顺序? (例如,如果另一个用户同时尝试$push一个新条目,我想确保只有在重新排序后,新条目才被$push编辑) 如果我执行find(),然后在PHP中重新排序,然后执行update(),如果操作不是原子操作,我可能会丢失新的$pushed条目 这是一个示例播放列表对象: { "_id" : "playlist1", "title" : "Playlist One", "en
播放列表
收藏。集合中的每个文档都包含一个条目
字段,即一个数组
如何原子地更改播放列表中项的顺序?
(例如,如果另一个用户同时尝试$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需要一个写锁,这意味着它会阻止其他操作
(来自)
我只需要在MongoDB服务器上执行代码(find()
+reorder()
+update()
)
不过,如果您有另一个不涉及“字符串中的代码”的想法(例如,$func=“function(){do_something();return\'something\'”}
),请分享
谢谢 使用eval()来阻止操作是当前实现的一个副作用,而不是一个可以依赖的特性
MongoDB wiki有一个页面,其中包含有关的信息
与您的用例相关的策略是:
获取对象
在本地修改对象
发送一个更新请求,说明“如果对象仍然匹配其旧值,则将其更新为此新值”