2

MongoDB の Array 型を使用してスタックを実装した人はいますか?

append私は次のように配列にできることを知っています:

db.blogposts.update( {_id:5}, {$push: {comments: {by: "Abe", text:"First"}}})

ここでは、配列の最後がスタックの一番上です... 0 番目のインデックスにあるスタックの一番上でこれを実装する方法はわかりませんが、間違っていると思います。

peekそして、配列の最後の値で次のようにできることを知っています:

db.blogposts.find( {_id:5}, {comments: {$slice:-1}})

このような実装では、MongoDB update ステートメントでスタックの一番上を「覗く」ことができますか? それは、「スタックの一番上が X の場合、このアイテムをスタックにプッシュする」というセマンティックを与えてくれます。これをアトミック操作にする必要があります。

アドバイスをいただければ幸いです。ありがとう!

4

2 に答える 2

4

残念ながら、現在、あなたが説明したようにこれを正確に行う方法はありません。

Chris Shainが指摘したように、https: //jira.mongodb.org/browse/SERVER-2191-「$ push()を配列の前に」および同様にhttps://jira.mongodb.org/browse/SERVER-1824-「特定の配列インデックスへの挿入のサポート」が役立ちますが、これらの機能は現在、特定のリリースバージョンで予定されていません。

考えられる回避策として、「lastElement」(または同等のもの)という名前のフィールドをドキュメントに追加できます。このフィールドには、配列にプッシュされた最後の要素のコピーが含まれています。次に、updateステートメントで、「lastElement」値に対してクエリを実行し、一致する場合は、同時に新しい値に設定し、同じ値を1回の不可分操作で配列にプッシュします。

例えば:

> 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"
    }
}
> 

別の方法として、「AtomicOperations」ドキュメントの「UpdateifCurrent」セクションで概説されている戦略を検討することもできます:http ://www.mongodb.org/display/DOCS/Atomic+Operations

これらは回避策であり、理想的な解決策ではないことを理解しています。うまくいけば、上記があなたの目標を達成するのに役立つか、少なくともあなたが別の解決策を考え出すための思考の糧を提供するでしょう。もしそうなら、ここでそれを共有してください。そうすれば、同様の問題を経験しているかもしれないコミュニティのメンバーがあなたの経験の利益を得ることができます。ありがとう。

于 2012-04-10T20:59:29.723 に答える