2012-04-10 10 views
2

Hat jemand den MongoDB-Array-Typ verwendet, um einen Stapel zu implementieren?MongoDB-Array als Stapel verwenden

Ich weiß, dass ich kann append einem Array wie folgt:

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

Hier wird das Ende des Arrays der Spitze des Stapels ist ... Ich sehe keinen Weg, dies zu implementieren mit die Spitze des Stapels am nullten Index, aber ich würde gerne falsch liegen.

Und ich weiß, dass ich kann peek auf dem letzten Wert des das Array wie folgt:

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

Mit einer Implementierung wie diese, kann ich „Peek“ an der Spitze des Stapels in einer MongoDB Update Erklärung? Das würde mir die Semantik geben, "schiebe dieses Element auf den Stapel, wenn die Spitze des Stapels X ist". Ich brauche das eine atomare Operation!

Jeder Ratschlag geschätzt. Vielen Dank!

+0

eines Arrays an den Anfang drängen Sieht so aus, ist noch nicht implementiert: https: //jira.mongodb .org/browse/SERVER-2191? page = com.atlassian.jira.plugin.system.issuetabpanels% 3Aall-tabpanel –

+1

Duplikate von [können Sie mongo $ push vorgeben statt anhängen?] (http://stackoverflow.com/questions/10131957/kann-du-hast-mongo-push-prepend-statt-append) –

Antwort

4

Leider gibt es derzeit keine Möglichkeit, genau das zu tun, was Sie beschrieben haben.

Als Chris Shain wies darauf hin, https://jira.mongodb.org/browse/SERVER-2191 - „$ push() an der Vorderseite der Array“ und ähnlich https://jira.mongodb.org/browse/SERVER-1824 - „Unterstützung für in bestimmten Array-Index einfügen“ würde helfen, aber diese Features, die derzeit für eine bestimmte Release-Version geplant .

Als eine mögliche Problemumgehung könnten Sie Ihrem Dokument ein Feld namens "lastElement" (oder gleichwertig) hinzufügen, das eine Kopie des letzten Elements enthält, das an das Array gesendet wird. In Ihrer update-Anweisung könnten Sie dann nach dem Wert "lastElement" abfragen, und wenn er übereinstimmt, setzen Sie ihn gleichzeitig auf den neuen Wert und drücken denselben Wert in einer einzigen atomaren Operation auf das Array.

Zum Beispiel:

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

Als Alternative können Sie die Strategie in der "Update, wenn Current" skizzierte betrachten Abschnitt der "Atomic-Operationen" Dokumentation: http://www.mongodb.org/display/DOCS/Atomic+Operations

Ich weiß, diese Arbeit ist - Umschläge und nicht ideale Lösungen. Hoffentlich hilft Ihnen das Obige, Ihr Ziel zu erreichen, oder zumindest einige Denkanstöße zu geben, damit Sie eine andere Lösung finden können. Wenn Sie dies tun, teilen Sie es bitte hier mit, damit alle Mitglieder der Community, die ähnliche Probleme haben, von Ihrer Erfahrung profitieren können. Vielen Dank.

+0

Das ist so ziemlich die Lösung, die ich in meinem Schema implementiert habe. Danke für die Bestätigung, dass ich nichts verpasst habe. –

+0

@RussWeeks: Es ist jetzt implementiert. Können Sie bitte die angenommene Antwort ändern? Seit v2.5.3 können Sie die '$ push - $ each - $ position: 0'-Syntax verwenden, was umständlich ist. Bitte helfen Sie auch [implementieren $ Unshift, indem Sie über dieses Thema abstimmen] (https://jira.mongodb.org/browse/SERVER-19974). –

3

Sieht aus wie von mongoDB v2.6, das jetzt über die $position Betreiber unterstützt wird: http://docs.mongodb.org/manual/reference/operator/update/position/

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

Die '$ push - $ each - $ position: 0'-Syntax ist peinlich.Bitte helfen Sie [implementieren $ Unshift, indem Sie zu diesem Thema abstimmen] (https://jira.mongodb.org/browse/SERVER-19974). –

Verwandte Themen