2016-08-29 4 views
0

ich eine Mongo Sammlung haben, wie diese SoMongo Aktualisierung innerhalb eines Doppel verschachtelte Array

db.users.find().pretty() 
{ 
    "_id" : ObjectId("57c3d5b3d364e624b4470dfb"), 
    "fullname" : "tim", 
    "username" : "tim", 
    "email" : "[email protected]", 
    "password" : "$2a$10$.Z9CnK4oKrC/CujDKxT6YutohQkHbAANUoAHTXQp.73KfYWrm5dY2", 
    "workout" : [ 
     { 
      "workoutId" : "Bkb6HIWs", 
      "workoutname" : "chest day", 
      "BodyTarget" : "Chest", 
      "date" : "Monday, August 29th, 2016, 2:27:04 AM", 
      "exercises" : [ 
       { 
        "exerciseId" : "Bym88LZi", 
        "exercise" : "bench press", 
        "date" : "Monday, August 29th, 2016, 2:29:30 AM" 
       }, 
       { 
        "exerciseId" : "ByU8II-s", 
        "exercise" : "flys", 
        "date" : "Monday, August 29th, 2016, 2:29:34 AM" 
       } 
      ] 
     }, 
     { 
      "workoutId" : "Bk_TrI-o", 
      "workoutname" : "Back day", 
      "BodyTarget" : "Back", 
      "date" : "Monday, August 29th, 2016, 2:27:12 AM" 
     } 
    ] 
} 

sieht schließlich würde ich möchte es wie dieses

db.users.find().pretty() 
{ 
    "_id" : ObjectId("57c3d5b3d364e624b4470dfb"),`enter code here` 
    "fullname" : "tim", 
    "username" : "tim", 
    "email" : "[email protected]", 
    "password" : "$2a$10$.Z9CnK4oKrC/CujDKxT6YutohQkHbAANUoAHTXQp.73KfYWrm5dY2", 
    "workout" : [ 
     { 
      "workoutId" : "Bkb6HIWs", 
      "workoutname" : "chest day", 
      "BodyTarget" : "Chest", 
      "date" : "Monday, August 29th, 2016, 2:27:04 AM", 
      "exercises" : [ 
       { 
        "exerciseId" : "Bym88LZi", 
        "exercise" : "bench press", 
        "date" : "Monday, August 29th, 2016, 2:29:30 AM", 
        "stats" : [ 
          { 
          "reps: '5', 
          "weight":'105' 
          } 
       }, 
       { 
        "exerciseId" : "ByU8II-s", 
        "exercise" : "flys", 
        "date" : "Monday, August 29th, 2016, 2:29:34 AM" 
       } 
      ] 
     }, 
     { 
      "workoutId" : "Bk_TrI-o", 
      "workoutname" : "Back day", 
      "BodyTarget" : "Back", 
      "date" : "Monday, August 29th, 2016, 2:27:12 AM" 
     } 
    ] 
} 

sehen ich die Statistiken Array hinzufügen möchten zum aktuellen Übungsfeld. Ich habe Probleme mit der Punktnotation mit einem Doppel verschachtelten Array

Ich habe versucht, diesen

db.users.update({ 
    'email': '[email protected]', "workout.workoutId": "Bkb6HIWs" ,"workout.exercises.exerciseId":"ByU8II-s" 
}, 
{ 
    $push: { 
      "workout.0.exercises.$.stats": {"sets":"sets", "reps":"reps"}}}) 

Welche tatsächlich funktioniert aber immer auf die ersten verschachtelten Übungen Push-Objekt.

jetzt, wenn ich dies tun ...

db.users.update({ 
    'email': '[email protected]', "workout.workoutId": "Bkb6HIWs" ,"workout.exercises.exerciseId":"ByU8II-s" 
}, 
{ 
    $push: { 
      "workout.0.exercises.1.stats": {"sets":"sets", "reps":"reps"}}}) 

und ersetzen die $ mit einer 1 an die zweite Übungen Array vorantreiben wird, die offensichtlich ist, was ich will. Aber ich baue eine Website, also kann ich das offensichtlich nicht hart programmieren. Ich muss das $ verwenden, aber es scheint nicht über das erste Übungsobjekt hinaus zu gehen.

Jede Hilfe würde ich sehr schätzen!

+1

'$' bedeutet die erste. Wie sollte Mongo wissen, welchen Index du aktualisieren möchtest? Die Abfrage sagt einfach was zu finden ist. Ich denke, Sie müssen das Dokument finden, es in Server aktualisieren und speichern. –

+0

Wenn die Anzahl der Trainingseinheiten ohne Grenzen ansteigt, müssen Sie möglicherweise den Entwurf Ihres Schemas überdenken, da das Dokument zu einem bestimmten Zeitpunkt die Größenbeschränkung von 16 MB überschreiten kann. –

Antwort

0

Dieser Abfrageteil gibt das erste übereinstimmende Objekt zurück, bei dem es sich um das gesamte Benutzerprofil und nicht um einen Übungseintrag handelt. Sie können also einfach E-Mail angeben, um das gleiche Objekt zu erhalten. "workoutId" und "exerciseId" sind redundant.

So wird dieser Push-Befehl nur in den ersten Eintrag der Übung drücken, wie Amiram im Kommentar sagte. In diesem Fall können Sie das gesamte Objekt abrufen, ändern und dann speichern.

Aber ich denke, dass Sie wahrscheinlich Ihr Schema für eine bessere Leistung neu gestalten müssen. Vielleicht ein Schema für Training und Sport machen, dann Referenz verwenden, um sie zu verbinden. http://mongoosejs.com/docs/populate.html

Verwandte Themen