2014-04-27 3 views
0

i besoin de mettre à jour toute valeur vu 0 à 1 utilisation mongo et php sous forme de tableau

enter code herearray (
    '_id' => new MongoId("5357c023dd34bcc9298b456e"), 
    '_type' => 
    array (
    '0' => 'Altibbi_Mongo_MemberNotification', 
), 
    'member_id' => '53068', 
    'notification_count' => new MongoInt32(30), 
    'notifications' => 
    array (
    '0' => 
    array (
     'actor_id' => '0', 
     'notification_type' => 'badge_top', 
     'date_added' => '2014-04-23 16:29:07', 
     'seen' => '0', 
    ), 
    '1' => 
    array (
     'actor_id' => '0', 
     'notification_type' => 'badge_country', 
     'date_added' => '2014-04-24 08:32:55', 
     'seen' => '1', 
    ) 
), 
) 

i besoin d'aide pour résoudre le problème que j'utilise $ ce jour seulement seul premier valeur i utiliser $ chacun et il ne fonctionne pas du tout

+0

Quel problème? Pourquoi vous attendiez-vous à ce que cela fonctionne en premier lieu? Pouvez-vous référencer le manuel de la fonctionnalité que vous essayez d'utiliser ici? – hakre

+0

$ this-> update (array ('member_id' => "53068", "notifications.seen" => "0"), array ('$ set' => array ('notification_count' => 0, 'notifications . $. seen '=> "1")); –

Répondre

0

l'opérateur positional $ que vous essayez d'utiliser sera uniquement mise à jour l'élément premier qui correspond du côté de la requête de votre déclaration de mise à jour. Ceci est actuellement prévu par la conception et mentionné dans la documentation.

Dans la mise à jour de l'ordre de plusieurs positions vous devez soit:

  1. effectuer plusieurs déclarations de mise à jour sur le document jusqu'à ce que le nombre modifié est retourné comme 0.

  2. Récupérer le document et modifier chaque élément du tableau pour définir votre nouvelle valeur.

Un exemple typique de codage de la 2ème approche est le long des lignes de:

var doc = db.collection.findOne({ "member_id": "53068" }) 

for (var x = 0; x < doc.notifications.length; x++) { 
    if (doc.notifications[x].seen == 0) { 
     var obj = {}; 
     obj["notifications." + x] = 1; 
     db.collection.update(
      { "member_id": "53068" }, 
      { "$set": obj } 
     ); 
    } 
} 

L'opérateur $each vous faites référence à est pour spécifier plusieurs éléments du tableau à utiliser avec d'autres opérateurs tels que $push et $addToSet qui ne s'appliquent pas ici car il s'agit de créer de nouveaux éléments.

Questions connexes