Javascript mongodb阵列重新排序和更新
我使用mongo存储私人消息,例如,我有一个这样的数组:Javascript mongodb阵列重新排序和更新,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我使用mongo存储私人消息,例如,我有一个这样的数组: { "_id": { "$oid" : "520b842005ab0d0000000003" }, "pmhistory": [ { "sendername": "Tati", "preview": "Hey Man!", }, { "sendername": "Dan", "preview": "Hey Moon!", }, {
{
"_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条目,另一个是使用$set
参数将Dans条目添加到pmhistory
数组的开头
是否可以使用一个查询而不是两个查询?在未获得
的情况下,更新中有冲突的MOD
,因为我正在更改数组的大小。您可以将$push与$slice结合使用来修复数组大小并清除最后一个元素
我认为最简单的方法是首先不要依赖数组顺序。我要做的是在每个子文档中添加一个附加字段“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"
}
然后在您的应用程序中,在显示部分,只需通过这个新的
上次更新的字段来确定您的顺序。我想您可能有点误解了。使用slice,我可以清除最后一个元素,但它可能不是最后一个。(查看更新后的代码),在删除Dans元素后,我必须将Dans元素添加到数组的开头。在您发布此内容之前,我最终使用了Dans元素,但有点不同,谢谢;)