有没有人使用MongoDB的数组类型来实现堆栈?
我知道我可以append
到这样一个数组:
db.blogposts.update( {_id:5}, {$push: {comments: {by: "Abe", text:"First"}}})
在这里,数组的结尾是堆栈的顶部...我不明白的方式与堆栈中的第零指数的顶部来实现这一点,但我很想是错误的。
我知道我可以peek
在的阵列,像这样的最后一个值:
db.blogposts.find( {_id:5}, {comments: {$slice:-1}})
有了这样的一个实现,我可以“偷看”在栈中的MongoDB update语句顶部? 这将使我的语义,“在堆栈上推这个项目,如果堆栈的顶部是X”。 我需要这是一个原子操作!
任何意见赞赏。 谢谢!
不幸的是,目前还没有办法为你描述准确做到这一点。
正如克里斯·沙恩指出, https://jira.mongodb.org/browse/SERVER-2191 - “$推(),以阵列前面”,同样https://jira.mongodb.org/browse/SERVER-1824 - “为插入到特定的数组索引支持”会有所帮助,但这些功能目前尚未提名为特定发行版本。
作为一个可能的方法,你可以添加一个名为“是以lastElement”(或同等学历)到您的文档,其中包含的最后一个元素的副本领域推到阵列。 在你的更新语句,然后你可以查询反对“是以lastElement”值,如果它匹配,同时将其设置为新的价值和推动相同的值到阵列中的单个原子操作。
例如:
> db.blogposts.save({_id:5, comments:[{by: "Abe", text:"First"}], lastElement:{by: "Abe", text:"First"}})
> db.blogposts.find().pretty()
{
"_id" : 5,
"comments" : [
{
"by" : "Abe",
"text" : "First"
}
],
"lastElement" : {
"by" : "Abe",
"text" : "First"
}
}
> db.blogposts.update({"lastElement.text":"First"}, {$set:{lastElement:{by: "Joe", text:"Second"}}, $push:{comments:{by: "Joe", text:"Second"}}})
> db.blogposts.find().pretty()
{
"_id" : 5,
"comments" : [
{
"by" : "Abe",
"text" : "First"
},
{
"by" : "Joe",
"text" : "Second"
}
],
"lastElement" : {
"by" : "Joe",
"text" : "Second"
}
}
>
作为替代方案,你可以考虑“原子操作”文档中的“更新,如果目前的”一节中列出的策略: http://www.mongodb.org/display/DOCS/Atomic+Operations
我知道这些都是变通办法,而不是理想的解决方案。 希望上面会帮你实现你的目标,或者至少提供一些精神食粮,为您想出了不同的解决方案。 如果你这样做,请在这里分享,这样谁可能遇到类似问题,社区中的任何成员可能有你的经验中获益。 谢谢。
貌似是MongoDB的V2.6的,这是现在通过支持$position
操作: http://docs.mongodb.org/manual/reference/operator/update/position/
db.blogposts.update(
{_id:5}
, {$push:
{comments:
{$each: {by: "Abe", text:"First"}
, $position:0 }
}
}
);