2017-10-11 4 views
0

Je voudrais mettre à jour un champ sans perdre les autres champs de la collection du script Perl.Commande de mise à jour MongoDB Perl

par exemple, j'ai cette collection:

{ 
"userid": 1234, 
"username": "tester", 
"password": "*****", 
"fullname": "For Test Only", 
"emails" :[ 
    { "email": "[email protected]", "active": true }, 
    { "email": "[email protected]", "active": true } 
] 
} 

Et je voudrais changer à ceci:

{ 
"userid": 1234 
"username": "tester", 
"password": "*****", 
"fullname": "For Test Only", 
"emails" :[ 
    { "email": "[email protected]", "active": false}, 
    { "email": "[email protected]", "active": true } 
] 
} 

Quand j'ai essayé de le changer de mon script Perl utilisant ceci:

$update_result = $users->update_one(
            { 'userid' => $doc->{'userid'}}, 
            { '$set'  => { 'emails.[0].email.active' => false }}, 
            { 'upsert' => 1} 
           ); 

J'ai obtenu le résultat suivant qui n'est PAS attendu:

{ 
    "userid": 1234 
    "username": "tester", 
    "password": "*****", 
    "fullname": "For Test Only", 
    "emails" :[ 
     { "active": false}, 
     { "email": "[email protected]", "active": true } 
    ] 
} 

L'email disparaît !! . Une idée pourquoi ne garde pas l'email?

Merci.

+0

Votre ligne 'de set' de $ est erroné - vous avez une seule citation ballants, et je suppose que vous devez avoir une clé pour la cartographie de valeur, alors que vous semblez avoir une valeur à la cartographie booléenne? Juste une supposition .... ça fait un moment .... – LeeGee

+0

Je ne pense pas, c'est sur la bonne ligne. – koul

+0

il ressemble à une citation unique de fermeture est manquant ici. sinon, cela devrait fonctionner comme ça. ''emails. [0] .email.active' => false' – Ossip

Répondre

0

vous n'avez pas besoin du email. supplémentaire là-bas:

$update_result = $users->update_one(
            { 'userid' => $doc->{'userid'}}, 
            { '$set'  => { 'emails.[0].active' => false }}, 
            { 'upsert' => 1} 
           );