2017-06-03 2 views
0

Wenn ich den obigen Code ausführen, erhalte ich den folgenden Fehler.

name: 'MongoError', 
    message: 'Cannot apply $pull to a non-array value', 
    ok: 0, 
    errmsg: 'Cannot apply $pull to a non-array value', 
    code: 16837, 

Unten ist mein MongoDB-Objekt.

{ 
    "_id" : ObjectId("593270b8bc98ea235cfaf68f"), 
    "username" : "[email protected]", 
    "roleId" : 3, 
    "userId" : ObjectId("593270b8bc98ea235cfaf68e"), 
    "profile" : { 
     "firstName" : "Hisham", 
     "lastName" : "Mubarak" 
    }, 
    "activeFlag" : 1, 
    "authType" : [ 
     "facebook" 
    ], 
    "emailVerified" : false, 
    "emailVerificationHistory" : [ 
     { 
      "email" : "[email protected]", 
      "verifyCode" : "59327155480b791b7845dfd7", 
      "requestDate" : ISODate("2017-06-03T08:20:37.156Z"), 
      "verifiedDate" : ISODate("2017-06-03T10:31:53.720Z") 
     } 
    ] 
} 

Wie suche ich durch die emailVerificationHistory Array verifyCode verwenden und die verifyCode entfernen nur aus diesem ersten Objekt innerhalb Array? Danke im Voraus für Ihre Hilfe.

Antwort

1

Ihre Nutzung von $pull ist falsch:

db.collection(USERDETAILS_COLLECTION).findOneAndUpdate(
    { "emailVerificationHistory.verifyCode":mailCode }, 
    {'$pull':{ "emailVerificationHistory": { "verifyCode": mailCode } }, 
    function(err,pullData) { 
     if(err) { 
      console.log(err); 
     } else { 
      res.send({msg: 'User Verified Succesfully', status: 1}); 
     } 
    } 
); 

Der $pull Update Operator funktioniert wie eine Abfrage an sich. Es nimmt also eine Bedingung und "zieht" die passenden Elemente aus dem Array.

Obwohl es eine gute Methode ist, eine Auswahlabfrage zu verwenden, um das Element im Array zu finden, verwenden Sie den positionellen Operator $ nicht für das Element, sondern liefern das Array selbst.

+0

Danke für den Tipp. Das Ändern des $ Pulls in $ Unset hat mir geholfen, das zu bekommen, was ich wollte. –

+0

@HishamMubarak Eigentlich wird '$ unset' das Array-Element nur durch' null' ersetzen. Wenn Sie es entfernen müssen, verwenden Sie tatsächlich $ Pull. Wenn Sie "nur eine von vielen Übereinstimmungen" löschen möchten, dann "$ unset" und dann "$ pull" als zwei Operationen. Ihr Wert sollte jedoch "einzigartig" sein, also sollten Sie '$ pull' verwenden. –

Verwandte Themen