2017-04-15 2 views
1

Bevor Sie es als Duplikat markieren: Lesen Sie weiter sorgfältig, ich versuche, den DOC vom DOC selbst zu aktualisieren. Kein SCHEMA oder MODEL verwenden. Daher geht jede .findById * direkt aus dem Fenster.Das Drücken eines neuen Objekts wird im Rückruf nicht erneut gesendet

Hier ist, was zur Zeit mein Schema aussieht (nur entsprechender Abschnitt):

let UserAccSchema = new Schema({ 
meta : { 
accessControl: { 
authTokens:[{ 
    issuedOn: { 
     type: Date, 
     default: Date.now() 
    }, 
    expiresOn: { 
     type: Date, 
     default: Date.now() + 1728000000 //Defaults to 20-days 
    }, 
    lastUsage: { 
     type: Date, 
     default: Date.now() 
    }, 
    authAgent: { 
     type: String, 
     default: "default" 
    } 
}]}} 
}); 

ich ein neues Objekt in "meta/Accesscontrol/authTokens" schieben will. Mein aktueller Ansatz ist:

UserAccSchema.methods.generateAuthToken = function (authAgent, cb) { 
    console.info("MongoUser | Auth | Attempting to generate auth token for user | " + this._id); 
    this.update({ 
     $push: { 
      "meta.accessControl.authTokens": { 
       authAgent: authAgent 
      } 
     } 
    }, {safe: true, new: true, upsert:true}, function (err, obj) { 
     if (err) { 
      console.error("MongoUser | Auth | Error occurred while saving auth-token information | " + err); 
      cb(new AppError("Auth token cannot be generated. Please try again.", AppError.ErrorCode.INTERNAL_SERVER_ERROR)); 
     } else { 
      console.info("MongoUser | Auth | Auth token for user was generated | " + JSON.stringify(obj)); 
      cb(null, obj); 
     } 
    }); 
}; 

der obige Code die Arbeit tut, aber das Problem, dass ich habe, ist, wenn das neue Objekt gedrückt wird, wird das neue Objekt wird in nicht zurückgegeben:

function(err,obj) { 

} 
diese

kehrt stattdessen:

{"n":1,"nModified":1,"ok":1} 

Was ich wissen will:

  • Wo liege ich falsch?
  • Mache ich das richtig? Irgendein anderer Weg, um $ den Obj zu drücken?

Danke

+0

'.update' Anzahl der geänderten Dokumente zurückgibt, nicht das Objekt –

+0

Bitte nehmen Sie sich einen Blick zu. http://stackoverflow.com/questions/31808786/mongoose-difference-of-findoneandupdate-and-update – Veeram

+0

@ pk08 Deshalb möchte ich wissen, gibt es eine andere Möglichkeit, dies zu tun, um den aktualisierten Teil zu bekommen. – AnkitNeo

Antwort

1

.update Nur gibt die modifizierte Anzahl der Dokumente

als {"n":1,"nModified":1,"ok":1}

die geänderten Dokumente zurückkehren können Sie findOneAndUpdate

wie db.foo.findOneAndUpdate({class: 3}, {$set:{name: 231}}, {new: true}) verwenden, um die Antwort zurück als

{ 
    "_id" : ObjectId("58db5f4a611f51a2bf08bbb0"), 
    "name" : "parwat", 
    "class" : 3 
} 
0
UserAccSchema.methods.generateAuthToken = function (authAgent, cb) { 
    console.info("MongoUser | Auth | Attempting to generate auth token for user | " + this._id); 
    this.findOneAndUpdate({_id: this._id}, {$set:{ 
      "meta.accessControl.authTokens": { 
       authAgent: authAgent 
      }}, {new: true}, function (err, obj) { 
     if (err) { 
      console.error("MongoUser | Auth | Error occurred while saving auth-token information | " + err); 
      cb(new AppError("Auth token cannot be generated. Please try again.", AppError.ErrorCode.INTERNAL_SERVER_ERROR)); 
     } else { 
      console.info("MongoUser | Auth | Auth token for user was generated | " + JSON.stringify(obj)); 
      cb(null, obj); 
     } 
    }); 
}; 
+0

Warum funktioniert findOneAndUpdate hier? – AnkitNeo

+0

Ich nehme an, Ihre Aufgabe ist so –

Verwandte Themen