2017-02-25 3 views
1

Ich habe eine Sammlung, die wie folgt aussieht:MongoDB> Hinzufügen ein neues Objekt in ein Objekt innerhalb eines Arrays

{ 
    _id: ..., 
    checkins: [ 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     }, 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     } 
    ] 
} 

Ich möchte ein neues Element created neben dem id und createdAt genannt hinzufügen Attribute (innerhalb Checkins, ein Array von Objekten). Und ich möchte es für alle Elemente tun, die dieses neue Element nicht haben.

Ich weiß, wie man überprüft, ob ein Objekt bereits ein Attribut enthält, aber ich habe einige Probleme beim Hinzufügen des Elements. Ich verwende den folgenden Code und gibt mir einen Fehler zurück, der besagt: Der positionelle Operator fand die erforderliche Übereinstimmung nicht aus der Abfrage.

db.profiles.updateMany(
    {}, 
    {$set: {"checkins.$.created": new Date(0)}} 
) 

Irgendwelche Ideen über was ich falsch mache?

Antwort

1

Als Update mehrerer Array Subdokumente ist nicht möglich, da (Check this post) ist, können Sie alle Dokumente gefunden, die ohne das created Feld mindestens eine Subdokument passen und dann eine Aktualisierung durch eine die Filialdokumente, die aktualisiert werden müssen:

db.profiles.find({ 
    "checkins": { 
     "$elemMatch": { "created": { "$exists": false } } 
    } 
}).forEach(function(doc) { 

    doc.checkins.filter(function(event) { 
     return !('created' in event) 
    }).forEach(function(event) { 

     db.profiles.update({ 
      "_id": doc._id, 
      "checkins": { 
       "$elemMatch": { "created": { "$exists": false } } 
      } 
     }, { 
      $set: { 
       "checkins.$.created": new Date(0) 
      } 
     }); 
    }); 
}); 

Beachten Sie, dass elemMatch mit exists verwendet wird, wird verwendet, um zu überprüfen, ob Feld vorhanden ist. Dies sollte Ihre anfängliche Fehlermeldung mit Ihrer updateMany Anfrage behoben haben (aber Ihre erste Anfrage wird nicht alle Ihre Array-Elemente aktualisieren)

Verwandte Themen