mongodb数组重新排序和更新
mongodb array re-order and update
我使用mongo来存储私有消息,例如,我有一个数组,如下所示:
{
"_id": { "$oid" : "520b842005ab0d0000000003" },
"pmhistory": [
{
"sendername": "Tati",
"preview": "Hey Man!",
},
{
"sendername": "Dan",
"preview": "Hey Moon!",
},
{
"sendername": "Hellen",
"preview": "Hello, Im proper!",
},
],
"user": { "$oid" : "520b842005ab0d0000000002" },
"userid": "1"
}
如果Dan发送了一条新消息,我需要将他的数组条目移动到位置0(pmhistory[0])并更新预览字段。
现在,我不得不向数据库发出两个查询,一个带有$pull
参数,从pmhistory
数组中取出Dans条目,另一个带有将Dans条目添加到pmhistory
数组开头的$set
参数。
是否可以使用1个查询而不是两个查询?没有得到have conflicting mods in update
,因为我正在更改数组的大小。
我认为最简单的方法是首先不依赖数组顺序。我想做的是在每个子文档中添加一个额外的字段"last_update",比如:
{
"_id": { "$oid" : "520b842005ab0d0000000003" },
"pmhistory": [
{
"sendername": "Tati",
"preview": "Hey Man!",
"last_updated": 1376581408222,
},
{
"sendername": "Dan",
"preview": "Hey Moon!",
"last_updated": 1376581406444,
},
{
"sendername": "Hellen",
"preview": "Hello, Im proper!",
"last_updated": 1376581508111,
},
],
"user": { "$oid" : "520b842005ab0d0000000002" },
"userid": "1"
}
然后,当Dan收到一条新消息时,您可以运行一个findAndModify
,如下所示:
db.so.findAndModify( {
query: { "pmhistory.sendername" : "Dan" },
update: {
$set: { "pmhistory.$.last_updated" : (new Date).getTime() }
},
new: true
} );
然后返回:
{
"_id" : ObjectId("520cf82fd3541122f936f72e"),
"pmhistory" : [
{
"sendername" : "Tati",
"preview" : "Hey Man!",
"last_updated" : 1376581408
},
{
"sendername" : "Dan",
"preview" : "Hey Moon!",
"last_updated" : 1376581716876
},
{
"sendername" : "Hellen",
"preview" : "Hello, Im proper!",
"last_updated" : 1376581508
}
],
"user" : ObjectId("520b842005ab0d0000000002"),
"userid" : "1"
}
然后在您的应用程序中,在显示部分,只需通过这个新的last_updated
字段按降序确定您的订单即可。
您可以将$push与$slice结合使用来固定数组大小并清除最后一个元素。
http://docs.mongodb.org/manual/reference/operator/slice/
相关文章:
- 如何在动态表更新后刷新整个表排序缓存
- 可拖动和可排序项目编号在更改时更新
- 更新标签数组时如何对其进行排序
- 更新“项目”选项以进行排序
- 使用一次更新对有序列表中的元素重新排序
- MongoDB使用排序和切片更新嵌套数组,不会对代码进行排序
- jQuery - 排序后更新可排序列表
- React Native ListView 不会在排序或检索新数据后更新
- 从服务器更新的 meteor 集合,不会在客户端上被动排序
- D3 - 为什么此排序函数不更新其选择中的所有元素
- 使用 AJAX 回调更新挖空可观察数组会生成随机排序的结果
- knockoutjs ObservableArrays 和排序函数:UI 未更新
- 如何在主干中对列表进行排序时更新模型的顺序属性
- jQuery UI's未激发可排序更新事件
- 使用Redis更新排序集
- 根据数字排序顺序更新自动重新排列HTML列表
- 在backbone.js中,如何使用新的模型数据更新视图,同时在没有完整渲染的情况下保持排序顺序
- 如何区分在同一列表中拖动和从一个列表移动到连接列表时的可排序更新事件
- jQuery可排序更新的数据没有被序列化
- 表排序器不能正确排序更新的行