2016-06-17 5 views
0

ich eine Liste wie diese haben:ein Array-Element Verschieben von einem Array Position in eine andere (Mongo)

{ 
    arr: [ 
     { _id: 'a', val: 1 }, 
     { _id: 'b', val: 4 }, 
     { _id: 'd', val: 0 }, 
     { _id: 'c', val: 8 } 
    ] 
} 

Und ich brauche {_id: d} das Element {_id: c} vor dem Element zu setzen. Wie kann ich es mit Mongo machen? Natürlich kann ich das Dokument auf meinen Server herunterladen, vorbereiten und auf den mongo Server hochladen. Aber ich denke, es ist kein guter Weg.

PS: sorry, ich brauche das Element zu bewegen (drücken Sie es an eine neue Position und entfernen Sie die man aus alten Position)

+0

Ich denke, ein einfacher Weg, dies zu tun wäre, um eine andere ID, die Sie können leichter Zugang und Art der durch die ID, wenn Sie das Dokument verwenden müssen. – DrakaSAN

+0

Möchten Sie Elemente austauschen oder sortieren? Wenn Sie sie sortieren müssen, gibt es eine $ sort-Option, die Sie möglicherweise verwenden können. – Soren

Antwort

0

Sie das Stichwort verwenden können $position angeben, wo in dem Array, das Sie wollen füge den Wert ein. Verwenden Sie es, wenn $push ein Element aktiviert ist und Sie dieses Element an einer bestimmten Stelle im Array einfügen können.

db.collection.update(
    {parameter: doc}, 
    {$push: { 
     arr: { 
      $each: [{_id: "c", val: 8}], 
      $position: 2 
     } 
    }) 

Dies wird dieses Objekt in Position 2 Ihres Arrays schieben. Wenn Sie versuchen, das Array zu manipulieren, indem Sie Objekte an bestimmten Punkten entfernen, können Sie sich auf die answer I linked in the comments beziehen.

+0

Wie entfernt er das Element in Position 3? Vielleicht wäre ein funktionierendes Beispiel gut. – Soren

+0

Es gibt mehrere Möglichkeiten, dies zu tun, mit '$ pull'. Ich weiß nicht, ob Sie in '$ pull' ein' $ position'-Feld angeben können, aber dafür gibt es andere Antworten: http://stackoverflow.com/questions/4969768/removing-the-array-element-in -mongodb-based-on-the-position-of-element –

+0

Und was ist mit dem Dokument, das an Position 2 ist –

0

Dieses Versuchen:

db.myCollection.find().forEach(function(doc){ 
     db.myCollection.update({_id: doc._id}, 
      {$set: {"arr.2": doc.arr[3], "arr.3": doc.arr[2]}}) 
    }) 
OR 
You can Pull and then push those documents 
+0

>> Natürlich kann ich das Dokument auf meinen Server laden, es vorbereiten und es auf den Mongo hochladen Server. Aber ich denke, es ist kein guter Weg. –

+0

Kopiert der Callback dies nicht in die Anwendung, anstatt nur auf dem mongodb-Server zu arbeiten? – Soren

+0

@Soren yeap, aber wenn ich auf dem Mongodb-Server arbeiten werde ich den Haupt-Thread blockieren. –

Verwandte Themen