2013-06-12 14 views
5

Gibt es eine Möglichkeit, ein Dokumentarray zu aktualisieren, um ein Objekt von einem Index zu einem anderen zu verschieben? z.B.Wie verschiebe ich ein Objekt in einem MongoDB-Array?

Als Ergebnis für JQuery-UI Sortierbare Ereignis it2 und it3 vertauscht Plätze. Als Ergebnis möchte ich ihre Position im myDoc aktualisieren, das in MongoDB gespeichert ist.

+2

Nein, es ist kein Weg, dass in einem einzigen Schritt zu tun. http: //docs.mongodb.org/manual/Referenz/Operator/# Operatoren. Tatsächlich gibt es nicht einmal eine Möglichkeit, ein Element in einen bestimmten Index einzufügen. Es ist ein ungelöstes/offenes Problem: https://jira.mongodb.org/browse/SERVER-2363. Sie müssen die gesamte Array-Liste neu schreiben. – WiredPrairie

+1

Was denken Sie, ist die beste Praxis dafür? –

+0

UPDATE: ab Version 2.6.in einen bestimmten Index einfügen mit $ Position - https://docs.mongodb.org/manual/reference/operator/update/position/ –

Antwort

1

Vorläufig gibt es keine Möglichkeit, dies direkt in Mongo mit jedem Treiber zu tun.

Sie müssen dies in Ihrer Anwendung tun und das Array mit Mongo setzen.

ex:

var new_array = ["it2","it1","it3"];//Do your sort/place in js 

$mongo_connexion->update({"name": "myDoc"}, {$set: {"items" : new_array}}); 
1

Hier ist eine andere Art und Weise ein Element an eine neue Position zu bewegen, die die Positionen von IT2 und IT3 tauschen wird ...

  1. Entfernen Sie das Element aus dem Array mit $ pull [ Docs Here ].

    update({"name": "myDoc"}, {$pull: {"items" : "it3"}}); 
    
  2. Das Element an der neuen Position mit $ push einfügen. [ Docs Here ].

    update({"name": "myDoc"}, { 
        $push: { 
         "items" : { $each : [ "it3" ], $position : 1 } 
        } 
    }); 
    

Wenn

Pouzor Antwort auf Verwenden $ Satz verwenden könnte einfacher sein und eine bessere Leistung für viele Anwendungsfälle.

Wenn jedoch mehrere Benutzer gleichzeitig Arrayelemente hinzufügen, entfernen und neu anordnen, bedeutet dies, dass Sie die Änderungen des anderen nicht überschreiben.

In einigen Fällen (z. B. große Array-Elemente) könnte es auch effizienter sein, weil weniger Daten geschrieben werden.

GOTCHA: Liste der Listen

Wenn die Liste Sie ein Array von Arrays Sie die $ alle Betreiber mit $ [ Docs Here ]

dieses Beispiel nehmen ziehen verwenden müssen, sind Nachbestellung ist:

{ 
    name: "myDoc", 
    items: [ 
     [ "User", "dofij20r91dj93" ], 
     [ "User", "239vjvidjfsldf" ], 
     [ "User", "2309jvdsjdkk23" ] 
    ] 
} 

Hier ist der Code zum Entfernen der ersten Liste aus der Liste der Listen:

update({"name": "myDoc"}, { 
    $pull: { 
     "items" : { 
      $all : [ "User", "dofij20r91dj93" ] // the sub-list to $pull 
     } 
    } 
}); 

Liste der Objekte

Das ist einfach. Sagen Sie bitte die folgende Liste von Objekten:

{ 
    name: "myDoc", 
    items: [ 
     { type: "User", id: "dofij20r91dj93", name: "Dave" }, 
     { type: "Group", id: "239vjvidjfsldf", name: "Accountants" }, 
     { type: "User", id: "2309jvdsjdkk23", name: "Toni" } 
    ] 
} 

Sie können wie folgt ziehen $:

update({"name": "myDoc"}, { 
    $pull: { 
     "items" : { type: "User", id: "dofij20r91dj93" } 
    } 
}); 
Verwandte Themen